sql-server之我需要行级锁定

yxwkf 阅读:38 2024-06-03 14:00:57 评论:0

这是对 Is it possible to force row level locking in SQL Server? 的扩展.这是用例

我有包含帐号、余额等的帐户表。许多应用程序都在使用该表。很有可能在我修改一个帐户时,其他人正在修改另一个帐户。所以预期的行为是我会锁定我的帐户(ROW),而其他用途将锁定他的(另一个 ROW)。

但是 SQL Server 2008 R2 将此锁定升级到页/表,并且第二个用户收到超时异常。我已经尝试了引用问题中提到的所有解决方案,但没有任何效果。

如何强制 SQL Server 仅锁定行级锁,或者如何修改此模型以使其适用于页/表锁定?

编辑
更新通过其 PK 定位单个记录,并且它已被索引,因此只有一行被更新/锁定,并且该过程不超过一分钟

编辑
现在看起来有些奇怪的事情正在发生。我正在为 DAL 使用 ORM 库,该库打开了多个连接,我已向他们的支持提出了这个问题。但是,出于测试目的,我在查询工具上打开了两个 session 并执行了以下操作

Session # 1 
begin tran 
UPDATE myTable SET COL_1 = COL_1 WHERE COL_1 = 101; 
 
Session # 2 
SELECT COL_1 FROM myTable WHERE COL_1 = 101; 

session #2 中的查询超时!!!查询 COL_1 的其他值工作正常。如果同一记录在另一个 session 中处于编辑模式,现在看起来 SELECT 会被一个 session 阻止。

尽管 Oracle 确实支持在被其他 session 修改时选择一行(使用默认参数/无关键字),但 SQL Server 不支持(使用默认参数/无关键字),因此问题似乎出在库上。

请您参考如下方法:

默认情况下,SQL Server 总是使用行级锁定......那么你到底需要什么??

如果锁定超过一定数量的行(大约 5000),那么 SQL Server 将执行 lock escalation (锁定表而不是单独锁定超过 5000 行)以优化性能并优化资源使用 - 但这是一件好事! :-)

有很多方法可以完全关闭它 - 但那些是 不建议! 因为您正在处理 SQL Server 存储引擎中的一个非常基本的机制。

看:

  • MSDN docs on lock escalation
  • Adam Machanic blog on lock escalation
  • Introduction to Locking in SQL Server - 也有脚本来可视化哪个进程正在锁定什么(行、页、表、锁定类型等)

  • 标签:
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号