2009-08-11 10 views
0

MS SQL Serverでデッドロックが発生する問題があります。 MySQLでは同じコードが問題なく実行されます。ROWLOCKをEJBで使用する方法

私の問題は、(デバイスに接続されている)ジョブを削除する要求を受け取り、その後、同じデバイスに対して新しいジョブを作成する要求を受け取ることです。ほとんどの場合、これは何の問題もなく動作しますが、デバイスの新しいジョブを作成する要求を受け取ったときに削除要求が完了しない場合、これがデッドロックを取得します。

アプリケーションはJBoss上で実行されており、メッセージキューから要求を受け取ります。

私は、おそらくrowlockキーワードを使用してMSSQLの問題を解決できることがわかりましたが、名前付きクエリを使用して同時にMySQLをサポートするにはどうすれば有効にできますか?

同じデバイスの次のリクエストを実行する前に、1つのリクエストが完了するように他の方法がありますか?

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

は同僚から私は彼が長い間、代わりにpagelockのMSSQL利用ROWLOCKを作ってみましたことを聞いたが、運を持つ:

削除いくつかの部分でスタックトレースは次のようになります。例外をキャッチしてクエリを再実行するなど、回避する必要があるたびに

私の場合はEJBを使用しているので、休止状態でローロックを強制する方法も見えませんでした。

問題であるページロックであることは、私が見つけることができる唯一の説明です。削除されたものと挿入されたものとの間には何の関係もありませんが、デバイス(手の届かないもの)と使用されるテーブルは例外です。

今のところ解決策は、例外をキャッチし、削除を再実行することです。

関連する問題