1

msdn で次のコード行を読みましたが、これについては明確でなく、シミュレートしたいと考えています。

反復不可能な読み取りは、2 番目のトランザクションが同じ行に数回アクセスし、毎回異なるデータを読み取る場合に発生します。これには、同じ行の複数の読み取りが含まれます。毎回、別のトランザクションによって情報が変更されます。

読み取りコミット分離レベルで最初のトランザクションによって行がロックされている場合、2 番目のトランザクションがデータにアクセスする方法がわかりませんでした。

4

4 に答える 4

3

このようにシミュレートできます。Microsoft SQL Management Studio を開きます。2 つのタブを開き、両方でトランザクションを開始します。

最初のウィンドウでデータを選択し、2 番目のウィンドウでそれを変更して変更をコミットします。

次に、前の選択を再実行します。データが変更されました。これは再現性のない読み取り現象です。 

ここに画像の説明を入力

于 2013-04-10T20:53:07.760 に答える
0

反復不可能な読み取りは、2 番目のトランザクションが同じ行に数回アクセスし、毎回異なるデータを読み取る場合に発生します。これには、同じ行の複数の読み取りが含まれます。毎回、別のトランザクションによって情報が変更されます。

ここでのポイントは次のとおりです。

  • トランザクション A を使用してデータを読み取り、読み取ったSELECT .....行に対して共有 (読み取り) ロックを取得しますが、それらを読み取っている間だけです (最初に読み取りを行った後、すぐにロックを解放します)。

  • トランザクション B は、これらの行の一部を変更できるようになりました

  • トランザクション A が戻ってきて、それらの行を再度読み取ると、SELECT ...今回は異なる結果が得られる可能性があります。

これは、デフォルト設定を使用するときに発生する問題です。読み取り操作は、読み取り中にのみREAD COMMITTED共有ロックを取得し、データの読み取り後すぐに解放します。その後、他のトランザクションがデータを変更できる(そしてそうする!) ため、同じ行を再度読み取ると、異なる結果が生じる可能性があります。

を使用REPEATABLE READすると、読み取りトランザクションは、トランザクションが終了するまで読み取り行の共有 (読み取り) ロックを保持するため、トランザクションが終了する前に他のトランザクションがデータを変更するのを防ぎます。

つまり、デフォルトのREAD COMMITTED分離レベルを使用した読み取り操作は、反復不可能な読み取りです。シミュレートする必要はありません - それらは本物です!

于 2013-04-10T20:51:57.877 に答える
0

SSMS で 2 つのクエリ ウィンドウを開く

最初のクエリ:

set transaction isolation level read committed
begin transaction
select * from _tmp

2番

update _tmp set id = 2

テーブルの作成と入力

create table _tmp ( id int)
insert _tmp (id )values(1)

最初のクエリを実行し、次に 2 番目のクエリを実行selectしてから、最初のクエリからステートメントを実行します

11回目と22回目が表示されます

于 2013-04-10T20:52:26.363 に答える