SQL SERVER 數據庫的鎖
共享鎖:用於讀取資源所加的鎖。擁有共享鎖的資源不能被修改。共享鎖在默認情況下是讀取了資源馬上被釋放。
排他鎖:和其他鎖都不兼容,包括其他排他鎖,排它鎖用於修改數據,當資源上加了排他鎖時,其他請求讀取或修改這個資源的事物都會被阻塞,直到排他鎖被釋放為止。
更新鎖:是共享鎖和排它鎖的結合,用於更新數據,更新數據時首先需要找到被更新的數據,此時可以理解為被查找的數據上了共享鎖。當找到需要修改的數據時,需要對被修改的資源上排他鎖。
sql server 通過更新鎖來避免死鎖的問題,因為共享鎖和共享鎖是兼容的,通過更新鎖和共享鎖兼容,使得更新查找時並不影響數據查找,而更新鎖和更新鎖之間是不兼容的,從而減少了死鎖的可能性。
舉例說明以上描述的鎖:
1.1. 創建環境
---創建表
Createtable student
(
studentidint,
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,'李四','男')
1.1. 排他鎖
.新建兩個連接
在第一個連接中執行以下語句
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秒
1.1. 共享鎖
在第一個連接中執行以下語句
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秒.
1.1. 死鎖
1.1. 更新鎖
更新鎖
在第一個連接中執行以下語句
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'
在第二個連接中如果同樣加更新鎖,則會阻塞當前查詢,直到連接釋放更新鎖。如果不加更新鎖則直接可以讀取更新鎖的記錄。
,有時候我需要控制某條記錄在我讀取後就不許再進行更新,那麽我就可以將所有要處理當前記錄的查詢都加上更新鎖,以防止查詢後被其它事務修改.將事務的影響降低到最小。
SQL SERVER 數據庫的鎖