web-dev-qa-db-ja.com

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

Kimberly L. TrippによるMSDNの記事によると、Neal Gravesの " SQL Server 2005 Row Versioning-Based Transaction Isolation

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

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

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

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

さて、この質問への答えはすぐに私のその他の保留中の関連する質問に答えるべきです:

11
Fulproof

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

一つだけです。

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


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

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

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

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

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

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

11
Paul White 9