29

RowVersion列の値自体は、行が更新されるたびに変化することを除いて、それ自体では役に立たないことを知っています。しかし、相対的な(不等式)比較に役立つかどうか疑問に思っていました。

列を持つテーブルがある場合RowVersion、次のいずれかに該当します。

  • 同時に発生するすべての更新 (同じ更新ステートメントまたは同じトランザクション) は、RowVersion列に同じ値を持ちますか?
  • 「A」を更新してから「B」を更新すると、更新「B」に含まれる行の値は、更新「A」に含まれる行よりも高くなりますか?

ありがとう。

4

8 に答える 8

39

MSDN から:

各データベースには、データベース内の列を含むテーブルに対して実行される挿入操作または更新操作ごとにインクリメントされるカウンターがあります。rowversionこのカウンターはデータベースrowversionです。これは、クロックに関連付けることができる実際の時間ではなく、データベース内の相対時間を追跡します。列のあるが変更または挿入されるたびに、インクリメントされたデータベースが列に挿入されます。rowversionrowversion rowversion

http://msdn.microsoft.com/en-us/library/ms182776.aspx

  • 私の知る限り、システム内で実際に同時に起こることは何もありません。これは、すべてrowversionの が一意でなければならないことを意味します。同じテーブル内で重複が許可されている場合、それらは事実上役に立たないとあえて言います。また、rowversions が複製されていないことに信憑性を与えるのは、違反が発生するためではなく、外部キーの問題が発生するため、それらを主キーとして使用しないという MSDN のスタンスです。
  • MSDN によると、「rowversion のデータ型は単に増加する数値です...」ということで、そうです、後のほうが大きくなります。

どのくらい増加するかという質問に対して、MSDN は、「[ rowversion] はデータベース内の相対時間を追跡する」と述べています。これは、流動的な整数の増加ではなく、時間ベースであることを示しています。ただし、この「時間」は正確な時期を明らかにするものではなく、他の行に関連して行が挿入/変更された時期を明らかにします。

于 2010-12-17T13:36:34.457 に答える
13

いくつかの追加情報。RowVersion は bigint に適切に変換されるため、デバッグ時に読みやすい出力を表示できます。

CREATE TABLE [dbo].[T1](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
    [RowVer] [timestamp] NOT NULL
) 

insert into t1 ([value]) values ('a')
insert into t1 ([value]) values ('b')
insert into t1 ([value]) values ('c')
select Id, Value,CONVERT(bigint,rowver)as RowVer from t1
update t1 set [value] = 'x' where id = 3
select Id, Value,CONVERT(bigint,rowver)as RowVer from t1
update t1 set [value] = 'y' 
select Id, Value,CONVERT(bigint,rowver)as RowVer from t1

Id  Value   RowVer
1   a   2037
2   b   2038
3   c   2039

Id  Value   RowVer
1   a   2037
2   b   2038
3   x   2040

Id  Value   RowVer
1   y   2041
2   y   2042
3   y   2043
于 2011-02-19T12:45:24.653 に答える
6

特定のシーケンス番号の後に更新された列を要求するために、これで何かを整理しようとして何年も費やしました。タイムスタンプは実際には単なるシーケンス番号です。BitConverter.ToInt64 などの C# 関数がリトルエンディアンを必要とする場合、これもバイエンディアンです。

エイリアス列「SequenceNo」を使用して、データが必要なテーブルにdbビューを作成することになりました

SELECT     ID, CONVERT(bigint, Timestamp) AS SequenceNo
FROM         dbo.[User]

c# コードは最初に通常のテーブルと同じようにビュー (つまり UserV) を認識します

次に、私のlinqで、ビューと親テーブルを結合して、シーケンス番号と比較できます

var users =  (from u in context.GetTable<User>()
                join uv in context.GetTable<UserV>() on u.ID equals uv.ID
                where mysequenceNo < uv.SequenceNo
                orderby uv.SequenceNo
                select u).ToList();

私が欲しいものを手に入れるために-最後にチェックしてからすべてのエントリが変更されました。

于 2014-03-18T15:37:58.580 に答える
5

タイムスタンプのデータ型が悪いと思う理由は何ですか? データ型は、並行性チェックに非常に役立ちます。Linq-To-SQL はまさにこの目的のためにこのデータ型を使用します。

ご質問への回答:

1) いいえ。この値は、行が更新されるたびに更新されます。行を 5 回更新すると、更新ごとに Timestamp の値が増加します。もちろん、「同時に発生する」更新は実際にはそうではないことはおわかりでしょう。それらは、一度に 1 つずつしか発生しません。

2) はい。

于 2010-12-17T13:28:10.463 に答える
5

注として、timestampSQL Server 2008 以降では非推奨です。rowversion代わりに使用する必要があります。

MSDN のこのページから:

タイムスタンプ構文は非推奨です。この機能は、Microsoft SQL Server の将来のバージョンでは削除される予定です。新しい開発作業でこの機能を使用することは避け、現在この機能を使用しているアプリケーションを変更することを計画してください。

于 2012-07-04T12:05:12.547 に答える
3

Rowversion は、SQL の「理想主義的」アプローチの 1 つを打ち破ります。つまり、UPDATE ステートメントは単一のアトミック アクションであり、すべての UPDATE (行内のすべての列とテーブル内のすべての行の両方に対して) が発生したかのように動作します。同時"。ただし、この場合、Rowversion を使用すると、ある行が別の行とわずかに異なる時間に更新されたことを判断できます。

行が (単一の update ステートメントによって) 更新される順序は保証されていないことに注意してください。偶然にも、テーブルのクラスター化されたキーと同じ順序に従う可能性がありますが、それが真実であるとは考えていません。

于 2010-12-17T14:05:28.680 に答える
2

質問の一部に答えるには: MSDN によると、値が重複する可能性があります。

重複する rowversion 値は、rowversion 列が SELECT リストにある SELECT INTO ステートメントを使用して生成できます。この方法で rowversion を使用することはお勧めしません。

ソース:行バージョン (Transact-SQL)

于 2014-01-14T11:45:03.610 に答える
0

すべてのデータベースには、データベースで行われるデータ変更ごとに1つずつインクリメントされるカウンターがあります。影響を受ける(更新/挿入による)行を含むテーブルにタイムスタンプ/行バージョン列が含まれている場合、データベースの現在のカウンター値は、更新/挿入されたレコードのその列に格納されます。

于 2011-04-15T16:32:25.700 に答える