1SQL SERVER 鎖的概念sql
共享鎖:用於讀取資源所加的鎖。擁有共享鎖的資源不能被修改。共享鎖在默認狀況下是讀取了資源立刻被釋放。ide
排他鎖:和其餘鎖都不兼容,包括其餘排他鎖,排它鎖用於修改數據,當資源上加了排他鎖時,其餘請求讀取或修改這個資源的事物都會被阻塞,直到排他鎖被釋放爲止。spa
更新鎖:是共享鎖和排它鎖的結合,用於更新數據,更新數據時首先須要找到被更新的數據,此時能夠理解爲被查找的數據上了共享鎖。當找到須要修改的數據時,須要對被修改的資源上排他鎖。server
sql server 經過更新鎖來避免死鎖的問題,由於共享鎖和共享鎖是兼容的,經過更新鎖和共享鎖兼容,使得更新查找時並不影響數據查找,而更新鎖和更新鎖之間是不兼容的,從而減小了死鎖的可能性。圖片
舉例說明以上描述的鎖:事務
---建立表資源
Createtable studentit
(table
studentidint,class
sname nvarchar(10),
sex nchar(1)
)
--插入學生
insert student values (1,'張飛','女')
insert student values (2,'甄姬','男')
insert student values (3,'招新','女')
insert student values (4,'王五','女')
insert student values (5,'李四','男')
.新建兩個鏈接
在第一個鏈接中執行如下語句
begintran
update dbo.student set sname='王景正' where studentid=1
waitfordelay'00:00:30'
committran
在第二個鏈接中執行如下語句
begintran
select * from dbo.student where studentid=1
committran
若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行既要等待30秒
在第一個鏈接中執行如下語句
begintran
select * from dbo.student with (holdlock)
where sex='女'
waitfordelay'00:00:30'
committran
在第二個鏈接中執行如下語句
begintran
select studentid,sname from dbo.student where sex='女'
update dbo.student set sname='韓旭' where sex='女'
committran
若同時執行上述兩個語句,則第二個鏈接中的select查詢能夠執行,而UPDATE必須等待地一個事物釋放
共享鎖轉爲排它鎖後才能執行,既要等待30秒.
更新鎖
在第一個鏈接中執行如下語句
begintran
select * from dbo.student with (updlock)where sname='華榮'
waitfordelay'00:00:30'
update dbo.student set sname='白楠楠'
committran
select * from sys.dm_tran_locks
在第二個鏈接中
begintran
select * from dbo.student with (updlock) where sname='華榮'
waitfordelay'00:00:30'
在第二個鏈接中若是一樣加更新鎖,則會阻塞當前查詢,直到鏈接釋放更新鎖。若是不加更新鎖則直接能夠讀取更新鎖的記錄。
,有時候我須要控制某條記錄在我讀取後就不準再進行更新,那麼我就能夠將全部要處理當前記錄的查詢都加上更新鎖,以防止查詢後被其它事務修改.將事務的影響下降到最小。