【问题标题】:Truncate during Select deadlock - SQL Server在选择死锁期间截断 - SQL Server
【发布时间】:2014-02-28 20:43:29
【问题描述】:

我们使用 SQL Server 2005 数据库。一些数据仓库表每天都会被截断并重新加载。当用户对同一张表运行 SELECT 语句时,我们会遇到死锁问题。

场景

  1. 用户运行报告(SELECT 语句)。
  2. 对上述 SELECT 中使用的表执行 TRUNCATE。
  3. TRUNCATE 从 SELECT 语句接收一个硬块。 SELECT 语句立即暂停。这会造成无限死锁。

有人对 SQL Server 机制有详细的解释吗?另外,有什么解决办法吗?

【问题讨论】:

  • “无限死锁”是什么意思?死锁监视器应该检测到死锁并回滚。您是否收到死锁受害者错误?或者你只是在谈论阻塞?如果是这样,请显示阻塞 DMV 的输出。

标签: sql-server-2005 data-warehouse truncate


【解决方案1】:

您可以使用事务隔离级别。

Set transactin isolation level read uncommitted

<query>|

【讨论】:

    【解决方案2】:

    如果没有更多信息,很难给出具体建议。您需要查看确切的查询以及它们使用的锁。

    以下是一些一般性建议:运行 TRUNCATEDEADLOCK_PRIORITY LOW 不会影响报告查询。稍等片刻重试该语句。

    您还可以选择DEADLOCK_PRIORITY HIGH 来终止报告查询并优先考虑截断。

    您也可以使用 LOW 重试 10 次,然后使用 HIGH 强制完成。

    请注意,TRUNCATE 已完全交易并且可以回滚。重试是安全的。

    【讨论】:

    • 我认为这非常接近。我怎样才能模拟测试呢?目前,我正在开始交易 T1;选择 * FROM 表;然后在结束事务之前,我将执行 TRUNCATE 表。这并不总是导致很多。有什么想法可以模拟吗?
    • TRUNCATE 本身不应该死锁,因为它需要一个 Sch-M 锁。只有一个锁的事务永远不会死锁(我认为)。这是一个死锁:pastebin.com/K8RN8EpZ 这不完全是您的场景,但您可以使用它来测试死锁优先级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多