使用Server时,我需要知道是否可以将RowLock用于更新语句。
我有以下问题:一个表不能同时接受同一记录的更改,在不同的记录中没有问题。为此,我为所需的记录做了一个带有SELECT / NOWAIT的UPDLOCK /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需要等待;
发布于 2018-07-11 13:21:41
您需要做的是关闭聚集/非聚集索引中的ALLOW_PAGE_LOCKS。如果您没有任何聚集/非聚集索引,您可以简单地添加一个新索引!但是要注意行级锁定的副作用。
ALTER INDEX YOURINDEX ON YOUR_TABLE SET ( ALLOW_PAGE_LOCKS = OFF )再现问题
我有两个同时进行的会议。会话1,尝试运行以下代码:
BEGIN TRAN
UPDATE dbo.tblTest SET Title='aa' WHERE id =1
WAITFOR DELAY '00:00:59'
ROLLBACK会话2试图运行以下代码:
UPDATE dbo.tblTest SET Title='bb' WHERE id =2我先执行会话1,然后执行会话2,我们看到Executing...In事实会话2中的两个会话都将等待会话1释放锁!
为了克服这个问题,我修改了我的索引并使用以下代码关闭了ALLOW_PAGE_LOCKS:
ALTER INDEX YOURINDEX ON YOUR_TABLE SET ( ALLOW_PAGE_LOCKS = OFF )现在,在会话1处于执行阶段时重试scenario...Now,但是会话2将执行它的语句,而不管会话的1条记录的锁是什么
https://stackoverflow.com/questions/51286118
复制相似问题