一、
鎖定類型Lock types
1.
Shared
lock (S):執行select指令時發生,相容於Shared與Update等lock。
2.
Exclusive
lock (X):執行insert、update與delete時發生,不會相容於任何一個lock。
3.
Update
lock (U):執行類似updtae tablea
set col1=’A’ where ID=2的時令時,sql server會先搜尋符合條件的資料,此時就會產生Update lock,而當找到並更新內容時會轉換成Exclusive lock。
4.
Intent
lock (IS, IX, IU, etc):當row有Exclusive lock時,在page、table與database層級就會產生IX lock,用來增加檢查lock的相容性效率。
二、
Update lock與Intent lock說明
1.
Update
lock的功能:預防死結,當有兩個session語法要更新同一筆資料時,例如:updtae tablea set col1=’A’ where ID=2 ,
l 若沒有Update lock的情況如下:
(1)
第一個session執行SQL時,因為要搜尋資料,故會放置Shared lock。
(2)
接著第二個session執行SQL也會放置Shared
lock,因為Shared lock是相容的。
(3)
當第一個session要更新資料時,會將Shared locks轉成Exclusive lock,但因為第二個session有Shared locks,故會等待第二個釋放lock。
(4)
當第二個session要更新資料時,也會將Shared lock轉成Exclusive lock,但因為第一個session有Shared lock,故會等待第一個釋放lock。
(5)
兩個session會無限的等待,就會產生死結(deadlock)。
l 若有Update lock的情況如下:
(1)
第一個session執行SQL時,因為要搜尋資料,故會放置Update lock。
(2)
接著第二個session執行SQL也會放置Update
lock,但因為Update lock是不相容的,故第二個session會被blocking,無法放置lock。
(3)
第一個session要更新資料將Shared lock成功轉成Exclusive lock
(4)
第一個session完成交易,釋放Exclusive lock。
(5)
第二個session將Shared lock成功轉成Exclusive lock並也完成交易。
(6)
皆大歡喜。
2.
Intent
lock的功能:增加檢查lock相容性的效率。
(1)
當session1刪除一筆資料,對row data放置Exclusive lock。
(2)
此時session1也會對page、table與database放置Intent Exclusive lock。
(3)
若有session2要對table放置Shared
lock時,session2藉由Intent Exclusive
lock知道table內已有Exclusive lock,而不用逐筆檢查每一筆row。
三、
參考:
沒有留言:
張貼留言