首页 > 开发 > 综合 > 正文

关于X锁的问题--由select+X锁是否持有到事务结束的误区

2024-07-21 02:47:55
字体:
来源:转载
供稿:网友
关于X锁的问题--由select+X锁是否持有到事务结束的误区

前言:看了宋桑的文章《一次意外的X锁不阻塞问题》,结合本人的测试,说明一下我对select中使用X锁是否会持有到事务结束产生的误区;

详情不多说了,详见宋桑的《一次意外的X锁不阻塞问题》和《消失的共享锁》,对Select+X锁和Select+S锁的情况进行了解释。以下只描述我的测试;测试表结构及数据如下:

 1 /****** Script for SelectTopNRows command from SSMS  ******/ 2 CREATE TABLE [test_a].[dbo].[tmp_byxl_01](id INT IDENTITY,flag int) 3 INSERT INTO [test_a].[dbo].[tmp_byxl_01](flag) VALUES(null) 4 go 7 5 UPDATE [test_a].[dbo].[tmp_byxl_01] SET flag=id  6  7 SELECT TOP 1000 [id] 8       ,[flag] 9   FROM [test_a].[dbo].[tmp_byxl_01]10 11 12 -------------------------------13 id          flag14 ----------- ----15 1           116 2           217 3           318 4           419 5           520 6           621 7           722 23 (7 行受影响)

由于案例出自系统续费问题,业务采用的是调用存储过程的方式实现,因此每一次调用时,都是select+X锁的方式;这和上述文章中提到的“Select+X锁和Select+S锁”的情况不太相同

先说我的误区

误区:select中指定的X锁将在查询结束后立即释放,并不持续到tran结束

测试代码如下:

--session_ABEGIN TRANSELECT * FROM [test_a].[dbo].[tmp_byxl_01](xlock) WHERE flag=2  WAITFOR DELAY '00:00:10'COMMIT--Session_BBEGIN TRANSELECT * FROM [test_a].[dbo].[tmp_byxl_01](xlock) WHERE flag=2COMMIT

由于两个tran都是申请xlock,在执行时,Session_A(spid=53)先执行,Session_B(spid=55)大约5秒后执行,通过SP_LOCK可以看到,spid=55申请X锁时被阻塞

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表