RCSI下X锁阻塞U锁一例

    使用RCSI可以使普通的数据库读取操作不再善用Share Lock,但不是所有的读操作都不会被阻塞。

    我一开始就把这个“读取操作”无限放大,认为从此不再有读/写操作相互阻塞的事情了。下面是不久之前系统里的一个例子,用来说明更新操作中,当SQL SERVER引擎用来确认更新范围的时候并不会读取快照,而是会使用和X锁不兼容的U锁。因此,即使一个语句的最终结果不会更新任何记录,他还是有可能会被阻塞。

 
     
/* SegmentA */
BEGIN TRAN
UPDATE CL_CCMX
SET [ JSDID ] = 1
WHERE /* Confition1 */
ROLLBACK

 

    开两个会话分别执行SegmentA和SegmentB,会发现,SegmentB被阻塞。查看会话和锁情况:

 

    解决办法比较笨,将Where条件更换为使用临时表:

 
     
/* Solution */
BEGIN TRAN
SELECT CCMXID
INTO #IDs
WHERE /* Confition */
UPDATE CL_CCMX
SET [ JSDID ] = 1
WHERE CCMXID IN ( SELECT ID FROM #IDs)
ROLLBACK
    因为我们没有想到更好的强迫SQLServer使用快照的方法。

    事情过去一段时间了。小记一把。

posted on 2010-12-30 19:41  陈伟强 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/chenwq/archive/2010/12/30/1922450.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值