gpt4 book ai didi

sql-server - 我需要行级锁定

转载 作者:行者123 更新时间:2023-12-01 08:35:53 26 4
gpt4 key购买 nike

这是对 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 - 也有脚本来可视化哪个进程正在锁定什么(行、页、表、锁定类型等)
  • 关于sql-server - 我需要行级锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10648448/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com