首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server行锁

Server行锁
EN

Stack Overflow用户
提问于 2018-07-11 13:00:00
回答 1查看 87关注 0票数 1

使用Server时,我需要知道是否可以将RowLock用于更新语句。

我有以下问题:一个表不能同时接受同一记录的更改,在不同的记录中没有问题。为此,我为所需的记录做了一个带有SELECT / NOWAITUPDLOCK /NOWAIT,如果不返回错误,则允许更改。问题是,如果用户A开始更改表记录1,然后用户B开始编辑表记录2,则用户A只能在用户B也完成时才能完成其更新。它会一直锁着等着。

我读了很多关于它的话题,但在那一点上都没有帮助。在我看来,Update操作似乎试图锁定整个表。他们是不同的路线,应该有办法来控制它。

我有这样的设想:

第一步:开始交易;

步骤2:在启动更新之前,我需要锁定记录:'select * from Mytable with (updlock,nowait)其中Id = MyId';

如果没有任何例外,则记录被锁定;

步骤3:我的更新完成了:'update MyTable set some_field = some_value其中Id = MyId';

步骤4:提交事务;

问题是:

1-用户A,在记录1上启动更新(Id = 1);

2-用户B,在记录2上启动更新(Id = 2);

用户A需要执行您的更新。这是问题,直到用户B不提交或回滚您的事务,用户A需要等待;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 13:21:41

您需要做的是关闭聚集/非聚集索引中的ALLOW_PAGE_LOCKS。如果您没有任何聚集/非聚集索引,您可以简单地添加一个新索引!但是要注意行级锁定的副作用。

代码语言:javascript
复制
ALTER INDEX YOURINDEX ON YOUR_TABLE SET ( ALLOW_PAGE_LOCKS = OFF )

再现问题

我有两个同时进行的会议。会话1,尝试运行以下代码:

代码语言:javascript
复制
BEGIN TRAN

   UPDATE dbo.tblTest  SET Title='aa' WHERE id =1

   WAITFOR DELAY '00:00:59'

   ROLLBACK

会话2试图运行以下代码:

代码语言:javascript
复制
UPDATE dbo.tblTest  SET Title='bb' WHERE id =2

我先执行会话1,然后执行会话2,我们看到Executing...In事实会话2中的两个会话都将等待会话1释放锁!

为了克服这个问题,我修改了我的索引并使用以下代码关闭了ALLOW_PAGE_LOCKS

代码语言:javascript
复制
ALTER INDEX YOURINDEX ON YOUR_TABLE SET ( ALLOW_PAGE_LOCKS = OFF )

现在,在会话1处于执行阶段时重试scenario...Now,但是会话2将执行它的语句,而不管会话的1条记录的锁是什么

阅读更多关于它的信息:https://littlekendra.com/2016/02/04/why-rowlock-hints-can-make-queries-slower-and-blocking-worse-in-sql-server/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51286118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档