使用数据库死锁作为应用程序中的工作流

时间:2015-04-09 13:35:21

标签: sql-server deadlock software-design database-deadlocks

我最近发现我们的ERP软件在我们的MS SQL数据库中造成了很多死锁。 对我来说,我们应该始终避免陷入僵局。如果我们有一个,我们应该追踪它以了解原因并做出改变以消除它们。

但软件提供商说它就像设计一样:

  

1-新记录插入表A中,以便进行处理。

     

2-我们有2台JBoss服务器,监控同一个表以获取新记录。   只要有一台服务器可用,它就会处理记录和   然后删除/修改记录为已处理。

     

3-当然,如果2   服务器可用会导致死锁。

     

4-最后,自从其中一个JBoss以来,该应用程序不是问题   服务器将成功完成该过程。基于此,   软件供应商说死锁不是问题。

这导致每天约50到100个死锁。 让所有这些交易都发生好了吗? (因为确定了原因) 如果没有,我希望你们有充分的理由要求他们修改他们的软件过程。

由于

1 个答案:

答案 0 :(得分:0)

如果轮询的逻辑是这样的话,我会遇到种子死锁:

select top 1 @ID = ID from QUEUE where STATUS = 0

update QUEUE set STATUS = 1 where ID = @ID

这会导致死锁,因为有时这两个作业会在另一个作业能够更新之前获取相同的ID。

使用查询提示或在一个语句中执行update + select,可以非常轻松地修复此问题。如果您不知道哪种查询实际导致了死锁,那么这可能没什么帮助。