3

.NET /SQLServerトランザクションがどのように機能するかを基本的に理解していないことに気づきました。「ばかげた質問などない」という包み込みを押し進めているような気がしますが、私が読んだすべてのドキュメントを理解するのは簡単ではありません。答えがほとんど「はい/いいえ」になるように、この質問を表現しようと思います。

これを効果的に実行している1台のマシンで.NETプロセスを実行している場合(実際のコードではありません):

For i as Integer = 0 to 100
    Using TransactionScope
        Using SqlClient.SqlConnection
            'Executed using SqlClient.SqlCommand'
            "DELETE from TABLE_A"
            Thread.Sleep(5000)
            "INSERT INTO TABLE_A (Col1) VALUES ('A')"
            TransactionScope.Complete()
        End Using
    End Using
Next i

'SELECT count(*)FROM TABLE_A'が他のプロセスから実行されたときに常に'1'を返すトランザクション/分離レベルの構成はありますか(つまり、テーブルに行がない場合は5秒のチャンクがあります)トランザクションのコンテキストで)?

4

3 に答える 3

1

はい、表示されているトランザクションで行った変更を他のプロセスに表示させないようにすることができます。これを行うには、変更を行うプロセスではなく、他のプロセスを変更する必要があります。

スナップショットアイソレーションをIsolationLevel.Snapshotオンにして、他の読み取りプロセスで使用します。変更を加える直前の状態のテーブルが表示されます。彼らはブロックしません(待つ)。

于 2012-10-04T21:51:03.843 に答える
1

SNAPSHOTアイソレーションはあなたが探しているものです。ループを開始するときにテーブルに行があると仮定すると、SNAPSHOT分離レベルで実行されている同時SELECTは、実行されるタイミングに関係なく、待機することなく常に1行を参照します。

READ UNCOMMITTEDを除く他のすべての分離レベルも、常に正確に1行を表示しますが、多くの場合、最大5秒間ブロックされます。この引数では、READ_COMMITTED_SNAPSHOTをSNAPSHOTと見なしていることに注意してください。

ダーティリード、すなわち。REAd UNCOMMITTED分離レベルで実行されているSELECTは、0、1、または2行になります。これは間違いではありません。一度に2つ挿入したことがない場合でも、ダーティ読み取りで2行が表示されることがあります。これは、SELECTのスキャンポイントとトランザクションの挿入ポイントの間の競合状態が原因です。NOLOCKの場合、以前にコミットされた行が失われる可能性があります。ヒントは、同様の問題の議論に使用されます。

于 2012-10-04T21:53:28.010 に答える
0

デフォルトのトランザクションタイムアウトは1分だと思います( http://msdn.microsoft.com/en-us/library/ms172070.aspxを参照)。したがって、トランザクションのコンテキスト内では、テーブルが各コマンドはトランザクション内で順番に完了し、それは削除の結果であるため、挿入前にレコードはありません(一時停止に関係なく)。

お役に立てば幸いです。

于 2012-10-04T21:44:59.490 に答える