1

Microsoftのサイトhttp://msdn.microsoft.com/en-us/library/ms173763.aspxで読んだ

そのSQLServerは、データベースが回復されている場合を除いて、データの読み取り時にロックを要求しません。

READ_COMMITTED_SNAPSHOT / SNAPSHOTISOLATIONを使用しているSQLServerが共有ロックをまったく使用していないということですか?そんなことがあるものか?

たとえば、2つのトランザクションがある場合。最初のトランザクションT1は、いくつかの行を更新しようとしています。2番目のトランザクションT2は、同じ行の読み取りを開始します(このトランザクションは、彼を出力バッファー、応答バッファー、またはSQL Serverで呼び出されるものにコピーします)。同時に、トランザクションT1はその行の更新を開始します(最初にバージョン管理された行を作成しました)。

トランザクションT2がコミットされていないデータを読み取る可能性はありませんか?トランザクションT2は、T1が更新する前にその行のコピーを開始したため、その行に排他ロックがないことを忘れないでください。

この状況はさらに可能であり、データのコピー中にその行に共有ロックを設定せずにこれを回避するにはどうすればよいですか?

4

2 に答える 2

3

論理ロックのほかに、データベース構造(特に、この例ではページ)を保護するための物理ラッチもあります。ラッチは、分離レベルに関係なく、変更(ビットの変更)を保護します。したがって、T1がロックを取得しない場合でも、読み取るページで共有ラッチを取得する必要があります。そうしないと、読み取る構造そのものに対して行われる低レベルの同時変更の犠牲になります。T2は、ページ専用ラッチを取得した場合にのみ、変更する行を含むページを変更できます。したがって、T1は、T2が行を変更する前(したがって、行はT1が必要とする行)、またはT2が行に変更を加えた後(T1は前の行の画像を検索する必要があります)のいずれかでのみ行の画像を表示できます。バージョンストア)。

ラッチプロトコルは、コミットされていない読み取りやバージョン管理された読み取り(スナップショットやフレンドなど)を含むすべての分離レベルで尊重される必要があります。

于 2012-11-13T10:30:08.833 に答える
0

READ_COMMITTED_SNAPSHOT/SNAPSHOT ISOLATION を使用する Sql Server が共有ロックをまったく使用しないということですか? そんなことがあるものか?

これは、SQL Server が SNAPSHOT から読み取りを行っているために発生する可能性があり、これはまったく変更されません。他のプロセスからのコミットされていないトランザクションを無視して、現在のトランザクションの開始時の DB の状態で既に凍結されています。これは、トランザクションが参照できるようにtempdbにレコードのスナップショット(行バージョン管理) コピーを保持する SQL Server によって行われ、現在進行中のデータ/インデックス ページが変更されます。

トランザクション T2 がコミットされていないデータを読み取る可能性はありませんか? トランザクション T2 は、T1 が更新を行う前にその行のコピーを開始したため、その行には排他ロックがかかっていないことを思い出してください。

上記の物語はすでにこれを説明しています。しかし、説明するために(簡略化して):

シナリオ 1:

T1: begin tran (implicit/explicit)
T1: read value (4)
T2: read value (4) -- *
T1: update value to (8)

* - This is the committed value at the time the T2 transaction started

シナリオ 2:

T1: begin tran (implicit/explicit)
T1: read value (4)
T1: update value to (8)
     version of the row with the value (4) is made
T2: read value (4) -- * from the versioned row
T1: commit

* - (4) is [still] the *committed* value at the time the T2 transaction started
于 2012-11-13T10:18:11.150 に答える