SqlServerクエリ文で使用されるロック

1354 ワード

この間、**会社DBAが研修に来ました.MYSQLの最適化についてたくさん話しました.QAの一環のプログラマーの質問
「SQL文のwith nolockは、表をロックしない以外にロックされたデータを読めるかどうか」
講義をしている人は半日も説明しなかったが(MYSQLにはこのメカニズムがない可能性がある)、会社のもう一人のプログラマーは簡潔で明瞭な答えを出した.
WITH NOLOCKは、自身がテーブルをロックしない(ロックをかけない)だけでなく、他の既存のロックの影響も受けず、ロックされた行データも同様に読む
 
個人的にはこの言葉ははっきりしていて、一言で分かることだと思います.
でも不思議なことにプログラマーはよくこの文を使ってもやってみない.
ちなみに他のSQLSERVERのwithロックレベルについてまとめます
WITH NOLOCK:ロックなし
WITH HOLDLOCK:保持ロックを掛ける
WITH UPDLOCK:更新ロックを掛ける
WITH XLOCK:排他ロックを掛ける
with nolockはupdate,delete insertという更新文には使えないので注意してください.簡単に言えばwith nolockはselectにしか使えません
例えば、update dbo.test with(NOLOCK)set username='wokofo'--このような文は間違っています
バウンド:INSERT、UPDATE、DELETEまたはMERGE文のターゲット・テーブルでは、NOLOCKおよびREADONCOMMITTEDロック・プロンプトは使用できません.
実際に使用:
select top 10 * from dbo.test with(NOLOCK)
select top 10 * from dbo.test with(HOLDLOCK)
select top 10 * from dbo.test with(XLOCK)
select top 10 * from dbo.test with(UPDLOCK)


update dbo.test with(HOLDLOCK) set username='wokofo'
update dbo.test with(XLOCK) set username='wokofo'
update dbo.test with(UPDLOCK) set username='wokofo'

 
  http://www.580top.com/html/201203/dba_20.htm