2009-08-11 43 views
0

我在MS SQL Server上遇到死锁问题。相同的代码在MySQL上运行时没有问题。如何在EJB中使用ROWLOCK

我的问题是,我收到一个删除作业(连接到设备)的请求,之后收到为同一设备创建新作业的请求。大多数情况下,这种方式没有任何问题,但是偶尔在删除请求没有完成时,我收到为设备创建新作业的请求,这是我陷入僵局的地方。

该应用程序在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--- 

回答

0

从collegue我听说他很长一段时间一直试图让MSSQL使用ROWLOCK代替pagelock,但没有运气。每次他不得不解决问题时,比如捕获异常并重新运行查询。

在我的情况下,我使用EJB的,所以我什至不能看到如何强制执行与Hibernate的rowlocks。

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

因此现在的解决方案是捕捉异常并重新运行删除。