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'
在第二个链接中若是一样加更新锁,则会阻塞当前查询,直到链接释放更新锁。若是不加更新锁则直接能够读取更新锁的记录。
,有时候我须要控制某条记录在我读取后就不准再进行更新,那么我就能够将全部要处理当前记录的查询都加上更新锁,以防止查询后被其它事务修改.将事务的影响下降到最小。