1つのトランザクションで同じレコードが複数回更新された場合、いくつのバージョンが保存されますか?


11

Kimberly L. TrippによるMSDNの記事によると、Neal Gravesの「SQL Server 2005行バージョン管理ベースのトランザクション分離」

  • "... 特定のレコードの以前のバージョンはすべて、リンクリストにチェーンされています。また、長時間実行される行のバージョン管理ベースのトランザクションの場合、トランザクション的に一貫したバージョンにアクセスするには、アクセスごとにリンクをたどる必要があります。行」

これは、「行バージョニングを使用してコミットされた読み取りでの行バージョニング」と「スナップショット分離での行バージョニング」の両方のセクションに共通する「行バージョニングについて」セクションにあります。

さらに、変更による行のバージョン管理の例では、SNAPSHOTのみの複数のトランザクション(T1、T2、T3)による同じレコードの複数の更新のコンテキストで説明されています。

1つのトランザクションのみがレコードを複数回(複数のステートメントによって)更新する場合、複数のバージョンストアが保存(リンク)されますか、それともスナップショット「イメージ」の時点で取得されたもののみが取得されますか?

まあ、この質問への答えはすぐに私のその他の保留中の関連する質問に答えるはずです:

回答:


11

1つのトランザクションで同じレコードが複数回更新される場合、いくつのバージョンが保存されますか?

一つだけ。

行の最初の更新により、行バージョンが生成され、行が排他的にロックされます。同じトランザクション内で同じ行を後で更新しても、新しい行バージョンは生成されません。


行バージョンのリンクされたリストは、次のように発生します。

  • SNAPSHOTトランザクションのトランザクションT1は行を読み取り、値「a」を確認します。

  • トランザクションT2(分離レベル以下)は、値を「a」から「b」に更新してコミットします。これにより、値「a」の行バージョンが生成されます。

  • トランザクションT3(任意の分離レベル)は、値を「b」から「c」に更新してコミットします。これにより、値「b」の行バージョンが生成されます。この行バージョンは、 'a'の前の行バージョンにリンクしています。

  • トランザクションT1は、現在のページに格納されている値( 'c')から行バージョン 'b'までリンクをたどって行値を読み取り、次に行バージョン 'a'に戻ります。

行バージョンは、既存の読み取りトランザクションがあるかどうかに関係なく(任意の分離レベルで)データの変更によって生成されます。バージョンが必要になることはないかもしれませんが、それらは引き続き生成されます。トランザクションのT1がなくても、同じリンクされたバージョンのリストが作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.