0

我遇到了一个问题,我在 MS SQL Server 上遇到了死锁。相同的代码在 MySQL 上运行没有问题。

我的问题是我收到删除作业(附加到设备)的请求,然后我收到为同一设备创建新作业的请求。大多数情况下,这没有任何问题,但有时当我收到为设备创建新作业的请求时,删除请求还没有完成,这就是我遇到死锁的地方。

该应用程序在 JBoss 上运行,我收到来自消息队列的请求。

我发现我可能可以使用 rowlock 关键字解决 MSSQL 上的问题,但是如何在使用命名查询并同时支持 MySQL 时启用此功能?

或者有没有其他方法可以确保在对同一设备运行下一个请求之前完成一个请求?

删除了某些部分的堆栈跟踪如下所示:

2009-08-11 10:03:22,621 WARN  [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1205, SQLState: 40001
2009-08-11 10:03:22,621 ERROR [org.hibernate.util.JDBCExceptionReporter] Transaction (Process ID 200) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
2009-08-11 10:03:22,621 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: could not delete: [dme.dm.device.Task#131]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:82)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
---cut cut cut---
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 200) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
---cut cut cut---
4

1 回答 1

0

从一位同事那里听说他很长时间以来一直试图让MSSQL使用rowlock而不是pagelock,但没有成功。每次他都必须解决问题,比如捕获异常并重新运行查询。

在我的情况下,我使用的是 EJB,所以我什至看不到如何使用休眠强制行锁。

这是一个页面锁定问题,这是我能找到的唯一解释。除了设备(未触及)和使用的表之外,删除的内容和插入的内容之间没有任何联系。

所以现在的解决方案是捕获异常,然后重新运行删除。

于 2009-08-13T07:41:22.813 回答