2021年1月7日 星期四

SQL LOCK的情境介紹

  

一、Uplock 更新鎖 

用於可更新的資源上。防止當多個工作階段正在讀取、鎖定及後來可能更新資源時發生常見的死結


二、ReadPast 系統會略過資料被鎖定的資料列,取回未被鎖定的資料列 

以上兩個功能搭配的話,不會讓資料一直被鎖定中,如果交易發生碰撞行為時,會另外取得未被鎖定的資料,減少碰撞的機率。 

視窗A:

USE joyceRemine

GO

 BEGIN TRANSACTION Transaction1 

 SELECT TOP 10 * FROM issues WITH (UPDLOCK,READPAST) order by # asc 

 WAITFOR DELAY '00:00:30' 

ROLLBACK


同時另開新視窗

視窗B:

SELECT TOP 10 * FROM issues WITH (UPDLOCK,READPAST) order by # asc

結果如下 : 視窗B撈出另外10筆資料,不會與A視窗的資料重複

視窗A                       視窗B

 

 

 如果搭配update 語法 

 

BEGIN TRANSACTION Transaction1

        UPDATE issues

        SET 更新日期 = GETDATE()

        WHERE # in (SELECT TOP 10 # FROM issues WITH (UPDLOCK,READPAST) order by # asc ) 

 WAITFOR DELAY '00:00:10'

COMMIT

 這種語法就不用擔心死結了,就算同時大量湧進資料表執行這隻SPX,也不會更新同一批的資料囉~