死锁避免

时间:2016-03-21 10:55:52

标签: sql-server-2008 deadlock

我们有一个庞大的批处理过程,可以使用其他表更新XYZ表。此XYZ表还用于存储从应用程序UI输入的信息。现在,当这个批处理过程正在运行时,一些用户从UI输入数据进入XYZ表,导致用户事务中止。

错误:

  

Msg 50000,Level 13,State 52,Procedure trgInsertBuilding,101行   事务(进程ID 65)在锁定时死锁通讯   用另一个进程缓冲资源并被选为   僵局受害者。重新运行该交易。 Msg 3609,Level 16,State 1,   第1行事务在触发器中结束。批次已经   中止。

在批处理运行时,有没有办法将用户数据导入数据库?

1 个答案:

答案 0 :(得分:0)

如果没有查看实际的SQL为何/发生死锁的位置,很难说清楚。我假设您的批处理过程发生在一个单一的长事务中。如果许多记录非常庞大,在某些时候(或者如果不是从头开始),整个XYZ表都是独占锁定的。这意味着没有其他事务可以写入XYZ。

没有简单的解决方案,为了解决这个问题,应该重新考虑整个设计。但你可以尝试使用Snapshot isolation level in SQL Server。此选项会将SQL Server并发机制从悲观更改为乐观,允许同时写入同一个表(但不能写入相同的行)。

但请注意,这会影响整个数据库,在将其投入生产使用之前必须仔细考虑,研究和测试。