我想知道当您处于读提交隔离级别时,在一个会话中有人启动了一个包含select语句的显式事务,比如它需要20秒。来自不同会话的人能够在select语句仍在执行时更新该表中的记录吗?
我和一些人讨论过这个问题,根据他们的说法,它将能够更新那些记录,因为这就是更新锁发挥作用的地方,并且在查询仍在执行时将独占锁提供给更新。我找不到这方面的任何文档,也不知道如何测试这个
发布于 2021-04-06 00:10:11
我找不到这方面的任何文件
医生是这里。S锁与U锁兼容,但更新将使X锁真正完成,这与S锁不兼容。

也不知道怎么测试这个
您可以始终运行一个查询,例如
select count(*)
from sales.SalesOrderDetail with (tablock), master..spt_values v, master..spt_values v2, master..spt_values v3看看是否可以从另一个会话中更新。tablock是为了确保整个表被锁在S锁,因为它可能是或不可能是一个长期运行的选择。
您将发现,除非数据库具有快照选项集,否则SELECT将阻止更新。
发布于 2021-04-06 13:32:37
是的,其他人将能够更新第一次会话“正在读取”的行。其结果是,共享锁仅在该行的实际读取操作期间获得。
假设您在表中的行,让我们将它们称为第1行到第100行,并设想按您的选择(第1行、第2行、第3行、.)按该顺序读取的行。我们以第50行为例。在处理/读取第49行之后:
也就是说,在SQL server到达该行之前(但在SELECT启动之后),其他人可以更新该行。在读取该行之后(但在选择仍在进行中)之后,其他人可以修改该行。
https://dba.stackexchange.com/questions/289319
复制相似问题