首页 > 代码库 > sql的几种常用锁简述

sql的几种常用锁简述

SELECT * FROM dbo.AA
SELECT * FROM dbo.B
--1.排它锁
--增删改查都不行
--这个是数据库自己,为了出现数据错乱、脏数据自己加的处理机制
--连接1
begin tran

update dbo.B

set name=‘bb‘

where id=1

waitfor delay ‘00:00:30‘ --等待30秒

commit tran


--在第二个连接中执行以下语句

begin tran

select * from B

commit tran

 

--若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

 

--2)共享锁
--holdlock:可以查询但不能增删改
--在第一个连接中执行以下语句

begin tran

select * from dbo.B (HOLDLOCK) --holdlock人为加锁

waitfor delay ‘00:00:30‘ --等待30秒

commit tran

 

--在第二个连接中执行以下语句

begin tran

select * from dbo.B

update dbo.B

set name=‘ff‘

where id=‘1‘

commit tran

 

--若同时执行上述两个语句,则第二个连接中的select查询可以执行

--而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒


--3)TABLOCKX(独占锁)
--TABLOCKX:其他事务增删改查都不行
--在第一个连接中执行以下语句

begin tran

select * from dbo.B (TABLOCKX) --holdlock人为加锁

waitfor delay ‘00:00:30‘ --等待30秒

commit tran

 

--在第二个连接中执行以下语句

begin tran

select * from dbo.B

commit tran

 

--若同时执行上述两个语句,则第二个连接中的select查询要等待30秒


--3)死锁


--在第一个连接中执行以下语句

begin tran

update dbo.A

set name=‘aa‘

where id=‘1‘

waitfor delay ‘00:00:30‘

update dbo.B

set name=‘aa‘

where id=‘1‘

commit tran

 

--在第二个连接中执行以下语句

begin tran

update dbo.b

set name=‘aa‘

where id=‘1‘

waitfor delay ‘00:00:10‘

update dbo.A

set name=‘aa‘

where id=‘1‘

commit tran

 

--同时执行,系统会检测出死锁,并中止进程


--查看死锁
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type=‘OBJECT‘

--杀死死锁进程
kill spid

sql的几种常用锁简述