转:邹建--UPDATE 时, 如何避免数据定位处理被阻塞

转: http://blog.csdn.net/zjcxc/archive/2006/09/17/1232660.aspx

问题描述:

数据库PUBS中的authors表,想锁定CITYaaa的记录,为什么执行下面的命令后,CITYbbb的记录也被锁定了,无法进行UPDATE.

BEGIN TRANSACTION    

    SELECT * FROM authors

    WITH (HOLDLOCK)

    WHERE city='aaa'

如何才能锁定CITYAAA的记录,而且CITYBBB的记录依然能SELECTUPDATE

 

问题分析:

应该不是被锁住,应该只是检索数据的时候,需要从aaa的记录扫描到bbb的记录,而aaa被锁住了,所以扫描无法往下进行,这样看起来似乎就是bbb也被锁住了。

当然,也有可能确实是被锁住了,SQL Server的锁定默认是行级的,如果你的资源不足,则可能导致锁自动升级为页级甚至表级锁,这样会导致更多的记录被锁定。

使用下面的语句, 如果能读出数据, 则多半是第1种情况.

SELECT *

FROM authors WITH (READPAST)

WHERE city='bbb'

如果读不出数据, 则一般是第2种情况.

 

问题解决方法:

SELECT UPDATE 走不同的索引,这样在UPDATE 的时候,不用扫描已经锁定的数据就可以定义到记录,UPDATE 也就不会被阻塞了

指定索引用类似下面的语句:

SELECT *

FROM authors WITH (HOLDLOCK, INDEX=索引名)

WHERE city='aaa'

 

UPDATE A SET

    xx = xx

FROM authors A WITH (INDEX=索引名)

WHERE city='bbb'

当然,要保证仅扫描索引就可以定义到记录,否则可能还是会被阻塞。

   

补充

对于熟悉SQL Server锁的读者,可以通过 sp_lock,或者查询系统表 master.dbo.syslocksmaster.dbo.syslockinfo来确定行为。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值