gpt4 book ai didi

sql-server - SQL Server 中的锁定序列

转载 作者:行者123 更新时间:2023-12-02 18:44:54 25 4
gpt4 key购买 nike

有谁知道有一个资源可以告诉我在 SQL Server 2005 中的 select/insert/update/delete 期间将在表/页/行/索引上取出的锁的顺序以及不同的表如何提示和隔离级别会影响所采取的锁吗?

我知道我在这里问了很多,但这些信息肯定必须记录在某处吗?

提前致谢。

最佳答案

SQL Server 锁定基于 Transaction Processing: Concepts and Techniques 中的概念。 。本书非常详细地解释了如何获取锁、需要什么锁以及为什么事情必须是这样的。

Marc 链接的资源很好地涵盖了该主题,但细节分散,您需要知道在哪里查找。这是入门入门:

事务隔离级别仅影响读锁。在正常已提交读下,当读取一行时,会获取 S 锁,并在读取后立即释放该锁。如果隔离级别提升到可重复读取,则 S 锁将一直保持到事务结束为止。在更高的可序列化级别 range locks放置它们而不是简单的行锁,并且它们将一直保留到事务提交为止。快照模式的不同之处在于它们不一定影响锁的类型,但会影响读取的来源:而是从版本存储中检索行。

锁定顺序/层次结构始终相同:

  • 在任何 DML 操作开始时都会在元数据上放置 Sch-S 锁。 DDL 操作需要 Sch-M 锁,因此会发生冲突,因此 DML 可以确保其操作的模式(对象模式,而不是数据库模式...)的“稳定性”。
  • 行的锁层次结构路径是表-页-行。引擎实际决定的粒度为dynamic通常是行。
  • 无论粒度如何,实际锁定资源的路径都受到 intent locks 的保护。 。 IE。要对行进行 S 锁定,读取器必须在表和页上获取 IS 锁定。要对页面进行 S 锁定,它需要在表上进行 IS 锁定。
  • 单个分区操作在扫描中获取超过 5000 个锁可能会触发 lock escalation 。升级始终是一种尝试(即,如果失败,永远不会阻止)。实践中的升级总是从行级锁定升级到表(2008 年的分区)级锁定。

锁提示永远不能改变锁的顺序,它们只能改变:

  • 锁的类型(需要 S 锁时为 U 锁或 X 锁)
  • 粒度(强制表、页或行)
  • 持续时间(保持 S 锁)
  • 阻塞行为(读取以跳过不兼容的行)。

我没有过多谈论插入/更新/删除,因为它们非常无趣:它们需要 X 锁,仅此而已。唯一有趣的是更新的工作方式,因为它首先获取一个 U 锁,然后将其转换为 X 锁。需要此行为来利用 U-lock asymmetry允许在更新继续之前耗尽挂起的 S 锁。

通过这个,我希望您可以找到链接的文章和书籍中遗漏的所有详细信息。

关于sql-server - SQL Server 中的锁定序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1389785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com