資料庫鎖機制2-------排它鎖
阿新 • • 發佈:2018-11-04
排它鎖:
什麼是排它鎖:其他事務對該資源既不能讀也不能改,排它鎖獨佔資源
example 1: (假設id是連續增長的)
req1:update tabletast set .... where id >10
req2:update tabletast set .... where id <10
若req1先到達,給表id大於10的資料加上排他鎖,這時req2到達要給id小於10 的資料加上排它鎖,雖然req1並沒有釋放資源,但是兩者鎖的資源不衝突,所以req2不會被阻塞。
example 2: (假設id是連續增長的)
req1:update tabletast set .... where id >20
req2:update tabletast set .... where id <10
若req1先到達,給表id大於20的資料加上排他鎖,這時req2到達要給id小於10 的資料加上排它鎖,這時req2會被阻塞,只能等req1釋放排它鎖,req2才能加上排它鎖。說明同一資源只能有一個排它鎖。
example 3: (假設id是連續增長的)
req1:
開啟事務
select * from tabletest
update tabletest set ....
req2:
開啟事務
select * from tabletest
update tabletest set ....
若req1和req2同時到達 第一句,都給該表加上共享鎖,該表已存在兩個共享鎖,這時不會出現阻塞狀況。當req1和req2都開始執行第二句時,都想升級為排他鎖,這時事務沒結束,req1和req2的共享鎖還沒釋放,req1想升級為排它鎖,等待req2共享鎖的釋放,req2也想升級為排它鎖,等待req1共享鎖的釋放,形成了死鎖!