質問: JPA(EclipseLinkを使っています)でデッドロックを検出する処理を書きたいのですが、どのようにするものなのでしょうか? DBMS(SQLServer, Oracle, PostgreSQLを対象としています)側にデッドロック検出の機能はありますので、それによるロールバックの際に、JPAが何らかの例外を投げてくれるのではないかと思っています。 ただ、どんな例外なのか? デッドロック検出によるものだと判別できるのか? という辺りが分からず、どなたかご存知であれば、教えていただきたいです。
回答: EclipseLinkから呼び出される各RDBMS用のJDBCドライバーの実装(どの例外を返すか)に依存しますが、SQLTransactionRollbackExceptionをcatchするようにしておけば、いいと思います。MySQL 5.1.73の場合は、これを継承する`MySQLTransactionRollbackException`がスローされました。 実際にデッドロックを起こすコードを書いて実験してみると、分かります。 私が書いた記事ですが、参考まで: 例外処理はこんな感じでしょうか。 ``` } catch (SQLTransactionRollbackException e) { log.error("SQLTransactionRollbackException occurs: ", e); rollbak(conn); } catch (SQLException e) { log.error("SQLException occurs: ", e); rollbak(conn); } finally { close(stmt); close(conn); } ```