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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?