【问题标题】:Deadlock caused due to multiple inserts in a transaction由于事务中的多次插入导致的死锁
【发布时间】:2012-01-24 08:10:55
【问题描述】:

我有一个 sp,它有这样的插入语句:

begin transaction

insert into table1
insert into table2
.
.
.
insert into table n

commit transaction

只要不同时调用 sp,这一切都很好。但是,当同时调用 sp 时,有时会在第一个表的主键上遇到死锁问题。

【问题讨论】:

  • 在插入过程中是否锁定了表格?
  • 我所做的只是在事务中运行代码,如上例所示。

标签: sql-server deadlock


【解决方案1】:

这可以通过多种方式陷入僵局。发布实际的死锁图(actual xml,而不是死锁的图片!)。

如果您真的只有插入(没有读取),那么最可能的原因是外键约束。发布确切的架构定义(所有表定义、所有索引定义、所有约束,包括主键和外键)。顺便说一句,如果您定义了任何触发器,那么所有的赌注都会被取消,因为死锁可能是由任意触发器代码引起的。

【讨论】:

  • 你是对的。有使用第一个表的主键的外键。目前无法重现该问题。任何建议将不胜感激。
  • 一种廉价的方法是在数据加载窗口期间禁用 FK 约束,并在 ETL 之后重新启用它们。见ALTER TABLE ... WITH NOCHECK ...。如果表很大,则启用 FK 约束可能需要一些时间,因为它必须经过验证。
  • 另一个相对便宜的出路是使用版本控制(快照隔离或启用读取提交的快照)见Row Versioning-based Isolation Levels in the Database Engine
  • 禁用 FK 约束是否安全。
【解决方案2】:

您是否为您的数据库设置了一些可靠的隔离级别,例如 ReadCommitted?

【讨论】:

  • 未设置。但我相信 ReadCommited 是默认的。
猜你喜欢
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多