2

msdn のドキュメントを理解できなかった質問について教えてください。次のSQLコードがある場合:

declare C1 cursor for select * from tableA
open C1
fetch next from C1 into @a, @b..
while @@fetch_status = 0
 .. do something very time consuming for each row
 fetch next from C1 into @a, @b..
end
close c1

tableA が更新のためにロックされるのはいつですか? カーソル宣言中?オープン中、フェッチ中?またはオープンからクローズまで?

ありがとうございました

4

1 に答える 1

1

更新している行は、ステートメントの実行中に排他的にロックされます。UPDATEまたは、単一のトランザクション内にすべてのステートメントがある場合、これらの行は、トランザクションがコミットされる (またはロールバックされる) まで排他的にロックされます。

既定では、SQL Serverは行レベル ロックを使用します。ただし、1 つのトランザクションで 5000 を超える更新を行うと、SQL Server はロックのエスカレーションを実行し、問題のテーブル全体をロックして、個別のロックを処理しすぎないようにすることがあります。

于 2013-08-22T09:08:25.430 に答える