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

Use database deadlock as workflow in application

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

但是软件提供商说它是设计使然的:

1- New record are inserted in a table A, in order to be processed.

2- We have 2 JBoss servers, monitoring the same table for new record. As soon as one server is available, it will process the record and then delete/modifiy the record as processed.

3- Of course, if the 2 servers are available it will cause a deadlock.

4- At the end, not a issue for the application since one of the JBoss server will have complete the process successfully. So based on that, the software vendor is saying that deadlock are not an issue.

这导致每天大约 50 到 100 个死锁。 可以让所有这些解除锁定发生吗? (因为查明了原因) 如果没有,我希望你们有充分的理由要求他们修改他们的软件流程。

谢谢

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

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

update QUEUE set STATUS = 1 where ID = @ID

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

使用查询提示或在一个语句中执行更新 + select 可以很容易地解决这个问题。如果您不知道哪种查询实际上会导致死锁,那么这可能没有帮助。