sql-server – 在Sql Server中,有没有办法检查选定的一组行是否被锁定?

前端之家收集整理的这篇文章主要介绍了sql-server – 在Sql Server中,有没有办法检查选定的一组行是否被锁定?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们正在尝试更新/删除数十亿行表中的大量记录.由于这是一个受欢迎的表,因此本表的不同部分有很多活动.任何大型更新/删除活动都被阻止了很长一段时间(因为它等待锁定所有行或页锁或表锁)导致超时或需要多天才能完成任务.

因此,我们正在改变删除小批量行的方法.但我们想要检查所选的(例如100或1000或2000行)当前是否被其他进程锁定.

>如果没有,则继续删除/更新.
>如果它们被锁定,则转到下一组记录.
>最后,回到开始并尝试更新/删除遗漏的那些.

这可行吗?

谢谢,
的ToC

解决方法

So,we are changing the approach to delete small batch of rows at at time.

这是在small careful batcheschunks删除的一个非常好的主意.我会添加一个小的waitfor延迟’00:00:05’并且取决于数据库的恢复模型 – 如果已满,则执行日志备份,如果是SIMPLE则执行一个手动CHECKPOINT,以避免事务日志膨胀 – 批次之间.

But we want to check if the selected (let’s say 100 or 1000 or 2000 rows) are currently locked by a different process or not.

你所说的不是完全可能的开箱即用(记住你的3个要点).如果上述建议 – 小批量等待延迟不起作用(假设您进行了适当的测试),那么您可以使用查询HINT.

不要使用NOLOCK – 请参阅kb/308886,SQL Server Read-Consistency Problems by Itzik Ben-Gan,Putting NOLOCK everywhere – By Aaron BertrandSQL Server NOLOCK Hint & other poor ideas.

READPAST提示将有助于您的方案. READPAST提示的要点是 – 如果存在行级锁定,则sql服务器不会读取它.

Specifies that the Database Engine not read rows that are locked by other transactions. When READPAST is specified,row-level locks are skipped. That is,the Database Engine skips past the rows instead of blocking the current transaction until the locks are released.

在我的有限测试期间,当使用带有(READPAST,READCOMMITTEDLOCK)的schema.tableName中的DELETE并使用SET TRANSACTION ISOLATION LEVEL READ COMMITTED将查询会话隔离级别设置为READ COMMITTED时,我发现了非常好的吞吐量,这是默认的隔离级别.

猜你在找的MsSQL相关文章