sql-server之我需要行级锁定
这是对 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 存储引擎中的一个非常基本的机制。
看:
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。