Sql server 事务中多次插入导致死锁

Sql server 事务中多次插入导致死锁,sql-server,deadlock,Sql Server,Deadlock,我有一个sp,它有如下插入语句: begin transaction insert into table1 insert into table2 . . . insert into table n commit transaction 只要不并发调用sp,这一切都可以。但是,当同时调用sp时,我有时会在第一个表的主键上遇到死锁问题。您是否为db设置了一些可靠的隔离级别,如ReadCommitted?这可能会死锁。发布实际的死锁图(实际的xml,而不是解除锁定的图片!) 如果您真的只有插入(

我有一个sp,它有如下插入语句:

begin transaction

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

commit transaction

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

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

这可能会死锁。发布实际的死锁图(实际的xml,而不是解除锁定的图片!)


如果您真的只有插入(无读取),那么最可能的原因是外键约束。发布准确的模式定义(所有表定义、所有索引定义、所有约束,包括主键和外键)。顺便说一句,如果您定义了任何触发器,则所有下注都将关闭,因为死锁可能是由任意触发器代码引起的。

您在插入过程中锁定了表吗?我所做的只是在事务中运行代码,如您在上例中所示。未设置。但我相信ReadCommitted是默认的。你是对的。存在使用第一个表的主键的外键。目前无法重现该问题。任何建议都将受到欢迎。一个廉价的解决方法是在数据加载窗口期间禁用FK约束,并在ETL之后重新启用它们。看见如果表很大,启用FK约束可能需要一些时间,因为必须对其进行验证。另一个相对便宜的解决方法是使用版本控制(快照隔离或启用读取提交的快照)。请参阅禁用FK约束是否安全。