1

同じ ADO.Net ステートメントについて、分離レベルとロックに関する私の理解が正しいことを確認したいと思います。

  1. デフォルトの SQL Server 分離レベル (読み取りコミット) では、各行を読み取った後、行のロックが解除されます。

  2. 分離レベルを繰り返し読み取りに上げると、ロック (テーブル全体? または他のレベルのロック?) は while ループの終わりまで保持されますか?

例えば:

SqlCommand cmd = conn.CreateCommand();

cmd.CommandText= "select operation_id, operation_code, product_id, quantity
from dbo.operations where processed=0";

reader=cmd.ExecuteReader();

while (reader.Read())    
{
   // some operations
}

前もって感謝します、ジョージ

4

3 に答える 3

1

分離レベルの違いに関するいくつかの有用な記事: READ COMMITTED および REPEATABLE READ で選択すると、誤った結果が返される場合があります。

スナップショットの分離が役立つ場合と害がある場合

于 2009-07-11T18:00:59.927 に答える
1

反復可能な読み取りまたはシリアライズ可能な分離レベルでは、SELECT によって取得された行ロックは、ループの最後までではなく、トランザクションがコミットされるまで保持されます。明示的なトランザクションを指定しない場合、SELECT ステートメントは、SELECT ステートメントの完了時に自動コミットする暗黙的なトランザクションを開始します。これは while ループが終了する瞬間とは異なり、ループはクライアント上にあり、ループが終了する前にサーバー上で SELECT ステートメントが完了する可能性があります。

ミッチが言ったように、より高いレベルの分離レベルには、ファントム読み取りまたは反復不可能な読み取りを回避するという特定の目的があります。自動コミットされた暗黙的なトランザクション内の単一の SELECT ステートメントでは、より高い分離レベルを要求することはできません。これらのレベルは、データが複数回読み取られる複数のステートメント トランザクションでのみ機能します。実行している操作のコンテキストと、この SELECT が配置するロックについて懸念する理由を説明した方がよいでしょうか?

于 2009-07-11T18:33:12.377 に答える