RCSI下X锁阻塞U锁一例
时间:2010-12-30 来源:陈伟强
我一开始就把这个“读取操作”无限放大,认为从此不再有读/写操作相互阻塞的事情了。下面是不久之前系统里的一个例子,用来说明更新操作中,当SQL SERVER引擎用来确认更新范围的时候并不会读取快照,而是会使用和X锁不兼容的U锁。因此,即使一个语句的最终结果不会更新任何记录,他还是有可能会被阻塞。
/*SegmentA*/
BEGIN TRAN
UPDATE CL_CCMX
SET [JSDID] = 1
WHERE /*Confition1*/
ROLLBACK
开两个会话分别执行SegmentA和SegmentB,会发现,SegmentB被阻塞。查看会话和锁情况:
解决办法比较笨,将Where条件更换为使用临时表:
/*Solution*/因为我们没有想到更好的强迫SQLServer使用快照的方法。
BEGIN TRAN
SELECT CCMXID
INTO #IDs
WHERE /*Confition*/
UPDATE CL_CCMX
SET [JSDID] = 1
WHERE CCMXID IN (SELECT ID FROM #IDs)
ROLLBACK
事情过去一段时间了。小记一把。
相关阅读 更多 +