首页 > 代码库 > 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的几种常用锁简述