1. 程式人生 > >SQL SERVER 數據庫的鎖

SQL SERVER 數據庫的鎖

ali style student fff 概念 create one 分享 shadow

1SQL 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 數據庫的鎖