刪除大量資料造成Lock escalation鎖定升級 SQL Server
情況: 在MS-SQL 1.開一視窗Begin Transaction,delete from tableA (一萬多筆資料) 2.開另一視窗 insert into TableA () values() 發現步驟2怎麼都不會成功,就一直在執行 於是我將 步驟1刪除的資料縮小範圍,變成幾百筆,步驟2就馬上插入成功了! 於是,我上網問原來是因為Lock escalation(鎖升級)所造成的! 當在一個交易中(還未提交或rollback),操作了大量資料,應用程式會取得無數個row lock ,當row lock的數量超過了特定的值,為了減少locklist的負載,將row lock升級成table lock, 也就是整個表都被鎖起來了!導致我步驟2無法成功執行(另外一個連接)。 因為SQL Server Management在刪除大量資料時,是會全部找出來一起刪除,並不是一次一次刪除 為了避免鎖定升級的情況,我們可以採取分批次來刪除資料 批次刪除語法: /**每次刪除1000筆表A的資料**/ DoItAgain: DELETE TOP (1000) FROM TableA IF @@ROWCOUNT > 0 GOTO DoItAgain _________________________________________________________ 後來我還是想不通,我慢慢地把TOP的筆數提高,測試他的極限,發現7000又發生鎖定升級 DoItAgain: DELETE TOP ( 7000 ) FROM TableA IF @@ROWCOUNT > 0 GOTO DoItAgain ____________________________________________________________ 如何觀察鎖定升級(Lock escalation)? 1. SQL Management studio選取Tool->SQL Server Profiler 2.連接對應的DB 3.如下圖選擇 之後你開著追蹤視窗,邊下達指令來實驗,當鎖定升級的情況發生,會看到如下紀錄: ___________________...