【问题标题】:Why does a transaction under Snapshot Isolation Level take S and IX locks?为什么快照隔离级别下的事务需要 S 和 IX 锁?
【发布时间】:2013-07-26 23:17:27
【问题描述】:

我正在调查死锁,我在分析器的死锁 xml 文件中看到进程 process5332cf8Snapshot 隔离级别 (isolationlevel="snapshot (5)") 下运行事务。

但不知何故,它在一个页面上持有 IX 锁定,并想要获取另一个页面。

这可能是什么原因(除了隔离级别在操作过程中更改为非快照,这不太可能发生)?

我是否遗漏了一些关于 Snapshot IL 的内容?

PS:完整的xml:http://ideone.com/yuU9td

【问题讨论】:

    标签: sql-server deadlock snapshot isolation-level


    【解决方案1】:

    写入总是需要锁定。 IX 是写锁。至于其他进程(两个 SELECT,进程 process6593498 和 process5cc1498),它们处于读取提交状态。

    如果您想避免与快照隔离的争用,您必须首先将它用于您的 read 事务。

    【讨论】:

    • 似乎我真的误解了关于快照 IL 的一些内容。感谢您的回答)
    • 有点与这个主题无关,但是......你能告诉我,如果我没有明确开始事务,我如何强制我的 sql 语句使用快照运行?跨度>
    • 我是否应该始终明确地启动事务(即使是单个语句?)?否则它将在 RC(默认 IL)下运行
    • 是的,您必须开始交易。另一种方法是在数据库上启用 read_committed_snapshot,这将使读取已提交(默认)下的每个独立读取都使用所谓的“已提交读取快照隔离”(RCSI)。一个很好的阅读是Implementing Snapshot or Read Committed Snapshot Isolation in SQL Server: A Guide
    • 是的,谢谢。我最近已经读过那篇文章。这是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多