您好,登錄后才能下訂單哦!
1SQL SERVER 鎖的概念
共享鎖:用于讀取資源所加的鎖。擁有共享鎖的資源不能被修改。共享鎖在默認(rèn)情況下是讀取了資源馬上被釋放。
排他鎖:和其他鎖都不兼容,包括其他排他鎖,排它鎖用于修改數(shù)據(jù),當(dāng)資源上加了排他鎖時(shí),其他請(qǐng)求讀取或修改這個(gè)資源的事物都會(huì)被阻塞,直到排他鎖被釋放為止。
更新鎖:是共享鎖和排它鎖的結(jié)合,用于更新數(shù)據(jù),更新數(shù)據(jù)時(shí)首先需要找到被更新的數(shù)據(jù),此時(shí)可以理解為被查找的數(shù)據(jù)上了共享鎖。當(dāng)找到需要修改的數(shù)據(jù)時(shí),需要對(duì)被修改的資源上排他鎖。
sql server 通過更新鎖來(lái)避免死鎖的問題,因?yàn)楣蚕礞i和共享鎖是兼容的,通過更新鎖和共享鎖兼容,使得更新查找時(shí)并不影響數(shù)據(jù)查找,而更新鎖和更新鎖之間是不兼容的,從而減少了死鎖的可能性。
舉例說(shuō)明以上描述的鎖:
---創(chuàng)建表
Createtable student
(
studentidint,
sname nvarchar(10),
sex nchar(1)
)
--插入學(xué)生
insert student values (1,'張飛','女')
insert student values (2,'甄姬','男')
insert student values (3,'招新','女')
insert student values (4,'王五','女')
insert student values (5,'李四','男')
.新建兩個(gè)連接
在第一個(gè)連接中執(zhí)行以下語(yǔ)句
begintran
update dbo.student set sname='王景正' where studentid=1
waitfordelay'00:00:30'
committran
在第二個(gè)連接中執(zhí)行以下語(yǔ)句
begintran
select * from dbo.student where studentid=1
committran
若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則select查詢必須等待update執(zhí)行完畢才能執(zhí)行既要等待30秒
在第一個(gè)連接中執(zhí)行以下語(yǔ)句
begintran
select * from dbo.student with (holdlock)
where sex='女'
waitfordelay'00:00:30'
committran
在第二個(gè)連接中執(zhí)行以下語(yǔ)句
begintran
select studentid,sname from dbo.student where sex='女'
update dbo.student set sname='韓旭' where sex='女'
committran
若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則第二個(gè)連接中的select查詢可以執(zhí)行,而UPDATE必須等待地一個(gè)事物釋放
共享鎖轉(zhuǎn)為排它鎖后才能執(zhí)行,既要等待30秒.
更新鎖
在第一個(gè)連接中執(zhí)行以下語(yǔ)句
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
在第二個(gè)連接中
begintran
select * from dbo.student with (updlock) where sname='華榮'
waitfordelay'00:00:30'
在第二個(gè)連接中如果同樣加更新鎖,則會(huì)阻塞當(dāng)前查詢,直到連接釋放更新鎖。如果不加更新鎖則直接可以讀取更新鎖的記錄。
,有時(shí)候我需要控制某條記錄在我讀取后就不許再進(jìn)行更新,那么我就可以將所有要處理當(dāng)前記錄的查詢都加上更新鎖,以防止查詢后被其它事務(wù)修改.將事務(wù)的影響降低到最小。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。