代码之家  ›  专栏  ›  技术社区  ›  Tom Ferguson

在SQL Server中锁定序列

  •  6
  • Tom Ferguson  · 技术社区  · 16 年前

    是否有人知道在SQL Server 2005中的select/insert/update/delete期间将在表/页/行/索引上删除的锁序列,以及不同的表提示和隔离级别将如何影响所取锁?

    我知道我在这里问了很多问题,但这些信息一定要记录在某个地方吗?

    事先谢谢,

    汤姆

    2 回复  |  直到 16 年前
        1
  •  7
  •   Remus Rusanu    16 年前

    SQL Server锁定基于 Transaction Processing: Concepts and Techniques . 这本书详细解释了如何获取锁,需要什么锁以及 为什么? 事情一定是这样的。

    Marc链接的资源很好地覆盖了这个主题,但是细节是分散的,你需要知道从哪里看。下面是一个入门课程:

    事务隔离级别只影响读锁。正常情况下 read committed 当读取一行时,将获取一个S锁,该锁在读取后立即释放。如果隔离水平提高到 repeatable read 然后保存S锁,直到事务结束。在更高的 serializable 水平 range locks 而不是简单的行锁,它们一直保持到事务提交为止。快照模式不同,因为它们不一定影响锁的类型,而是从版本存储中检索read:rows的源。

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

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

    锁提示永远不能更改 秩序 对于锁,它们只能更改:

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

    我没有过多地谈论插入/更新/删除,因为它们非常无趣:它们需要X锁,就是这样。唯一有趣的是更新的工作方式,因为它首先获取一个U形锁,然后转换为X形锁。这种行为需要利用 U-lock asymmetry 这使得挂起的S锁可以在更新进行之前排出。

    有了这个,我希望你能去找出所有的细节,从文章和书籍链接。

        2
  •  2
  •   marc_s MisterSmith    16 年前

    这些怎么样:

    更新:这些关于事务隔离级别和查询提示的更多信息如何:

    如果您对这些相当高级的主题感兴趣,我强烈建议您 SQL Server 2008 Internals 这本书由卡伦·德莱尼(和其他人)所著,书中包含了所有这些细节——即使在这本书中,“锁定”主题也只在610页及以上开始:—)

    alt text http://ecx.images-amazon.com/images/I/51rX6Z83U3L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

    马克