2012-03-31 4 views
0

私は、SpringベースのWebサービスとSpring Jdbcベースの永続性を持つプロジェクトに取り組んでいます。 私はトランザクションを管理するためにDataSourceTransactionManagerを設定し、これをPointcutを使用してサービスレイヤーに適用しました。 トランザクションの伝播レベルが必須です。トランザクションの同時実行性を宣言的に処理する方法は?

クエリはSpringを通じて提供され、JdbcTemplateが提供されます。

サービスへの複数の同時リクエストが発生した場合、MySQLTransactionRollbackExceptionが発生します(「ロックを取得しようとするとデッドロックが見つかり、トランザクションを再試行してください」)。

明らかに、トランザクションの1つがロックを取得したため、2番目のトランザクションが失敗します。

私の質問は次のとおりです。 - 放棄して例外をスローするのではなく、ロックを取得できるまでSpringのサービス実行を遅らせるにはどうすればよいですか?

例外をキャッチしても、私はDAOをきれいに保つアドバイスとしてサービスレイヤーにトランザクションを適用しているため、クエリを再実行できません。

私は宣言的な解決策を得ることを望んでいます(私はAOPの熱狂的な&クルーセイダーの定型コードです:-))。しかし、プログラム的なソリューションでさえも大歓迎です。

ご意見ありがとうございます。

更新 -

@ninjaljはい、それは実際に本当のデッドロックでした。私はテストケースを間違って書いていました。愚かな私:-(

答えて

0

実際のデッドロックを示すので、実際にトランザクションを再試行する必要があります。IIRC、ロックを待機しているタイムアウトは、例外メッセージに「タイムアウト」があります。