加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 我需要行级锁定

发布时间:2020-12-12 16:26:40 所属栏目:MsSql教程 来源:网络整理
导读:这是 Is it possible to force row level locking in SQL Server?的扩展.这是用例 我有帐户表,帐号,余额等.许多应用程序正在使用此表.很可能在我修改帐户时,其他人正在修改另一个帐户.所以预期的行为是我会锁定我的帐户(ROW)而另一个用户将锁定他的(另一个ROW
这是 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行)以优化性能并优化资源使用 – 但这是一件好事!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读