这是
Is it possible to force row level locking in SQL Server?的扩展.这是用例
我有帐户表,帐号,余额等.许多应用程序正在使用此表.很可能在我修改帐户时,其他人正在修改另一个帐户.所以预期的行为是我会锁定我的帐户(ROW)而另一个用户将锁定他的(另一个ROW).
但sql Server 2008 R2将此锁定升级到页面/表,第二个用户获得超时异常.我已经尝试了所引用问题中提到的所有解决方案,但没有任何工作.
如何强制sql Server仅锁定行级锁定?或者如何以与页面/表锁定一起使用的方式修改此模型?
编辑
此更新通过其PK以单个记录为目标,并且已编制索引,因此只有一行正在更新/锁定,并且该过程不会超过一分钟
编辑
现在它看起来很奇怪.我正在为DAL使用ORM库,它打开了多个连接,我已经向他们的支持提出了问题.但是,出于测试目的,我在查询工具上打开了两个会话并且确实关注了
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的其他值的查询工作正常.现在看来,如果同一记录在另一个会话中处于编辑模式,则会阻止SELECT.
虽然Oracle确实支持在被其他会话修改时选择一行(使用默认的params / no关键字),但sql Server没有(使用默认的params / no关键字),所以看起来问题出在库中.
解决方法
默认情况下,sql Server始终使用行级锁定….那么你究竟需要什么呢?
如果您锁定超过一定数量的行(大约5000),那么sql Server将执行lock escalation(锁定表而不是单独超过5000行)以优化性能并优化资源使用 – 但这是一件好事! 原文链接:https://www.f2er.com/mssql/83486.html