首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取提交共享锁

读取提交共享锁
EN

Database Administration用户
提问于 2021-04-05 22:20:45
回答 2查看 377关注 0票数 0

我想知道当您处于读提交隔离级别时,在一个会话中有人启动了一个包含select语句的显式事务,比如它需要20秒。来自不同会话的人能够在select语句仍在执行时更新该表中的记录吗?

我和一些人讨论过这个问题,根据他们的说法,它将能够更新那些记录,因为这就是更新锁发挥作用的地方,并且在查询仍在执行时将独占锁提供给更新。我找不到这方面的任何文档,也不知道如何测试这个

EN

回答 2

Database Administration用户

回答已采纳

发布于 2021-04-06 00:10:11

我找不到这方面的任何文件

医生是这里。S锁与U锁兼容,但更新将使X锁真正完成,这与S锁不兼容。

也不知道怎么测试这个

您可以始终运行一个查询,例如

代码语言:javascript
运行
复制
select count(*)
from sales.SalesOrderDetail with (tablock), master..spt_values v, master..spt_values v2, master..spt_values v3

看看是否可以从另一个会话中更新。tablock是为了确保整个表被锁在S锁,因为它可能是或不可能是一个长期运行的选择。

您将发现,除非数据库具有快照选项集,否则SELECT将阻止更新。

票数 3
EN

Database Administration用户

发布于 2021-04-06 13:32:37

是的,其他人将能够更新第一次会话“正在读取”的行。其结果是,共享锁仅在该行的实际读取操作期间获得。

假设您在表中的行,让我们将它们称为第1行到第100行,并设想按您的选择(第1行、第2行、第3行、.)按该顺序读取的行。我们以第50行为例。在处理/读取第49行之后:

  • SQL server获取第50行上的共享锁。
  • Server读取行50
  • Server发布页面50上的共享锁

也就是说,在SQL server到达该行之前(但在SELECT启动之后),其他人可以更新该行。在读取该行之后(但在选择仍在进行中)之后,其他人可以修改该行。

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

https://dba.stackexchange.com/questions/289319

复制
相关文章

相似问题

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