sql server lock

各种锁的介绍:https://www.cnblogs.com/bdqczhl/p/13785567.html

典型用法:

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

BEGIN TRAN;
UPDATE Msg
SET Title = '公告'
WHERE ID = '55BA3F4B-184C-466B-995F-05749BD55A2B';
WAITFOR DELAY '00:00:10';
--等待10秒
COMMIT TRAN;

 

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

SELECT * FROM Msg WHERE ID = '832A1C27-FF79-4040-A3A8-7C7E97ACE208'; 查其它行,秒开

SELECT * FROM Msg WHERE ID = '55BA3F4B-184C-466B-995F-05749BD55A2B'; 查被锁的行,需要等待

SELECT * FROM Msg 查所有的行,需要等待

 

上面tran中的是update语句会自动锁行(锁住被update的行)

如果是select语句,需要手动加上with(xlock,ROWLOCK)

BEGIN TRAN;
SELECT *
FROM Msg with(xlock,ROWLOCK)
WHERE ID = '55BA3F4B-184C-466B-995F-05749BD55A2B';
WAITFOR DELAY '00:00:10';
COMMIT TRAN;

这行被锁住!

查其它行秒开;

查所有的行等待;

查被锁的行等待

 

 

with(xlock)

with(ROWLOCK)

with(xlock,ROWLOCK)

with(ROWLOCK,XLOCK,HOLDLOCK)

各种lock各种概念,还能排列组合一起用,排列组合各种锁的冲突关系。。。崩溃。。。

排列组合各种锁的冲突关系图:

 

 

 --这样对应着查,能排除掉被xlock的行!!

BEGIN TRAN
SELECT * FROM table with(xlock) WHERE ID = 1;
WAITFOR DELAY '00:00:10';
COMMIT TRAN;

SELECT *  FROM table with(READPAST,XLOCK)     

 

 

 

案例:

多个程序a,b,c一起跑,都干一件事:把表tbl_user中status=0的行的头像图片转存到本地磁盘,存完了就status=1

其中比较简单的办法就可以使用XLOCK

   

 

posted @ 2022-01-07 16:24  毛毛虫!  阅读(171)  评论(0编辑  收藏  举报