UPDATE 时, 如何避免数据定位处理被阻塞

探讨SQL Server中锁定特定记录时出现的意外锁定现象,分析原因并提供解决方案,包括使用不同索引以避免不必要的锁定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
数据库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种情况.
 
问题解决方法:
SELECTUPDATE走不同的索引,这样在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来确定行为。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值