39225


JPA（EclipseLinkを使っています）でデッドロックを検出する処理を書きたいのですが、どのようにするものなのでしょうか？  
DBMS（SQLServer, Oracle,
PostgreSQLを対象としています）側にデッドロック検出の機能はありますので、それによるロールバックの際に、JPAが何らかの例外を投げてくれるのではないかと思っています。  
ただ、どんな例外なのか？  
デッドロック検出によるものだと判別できるのか？  
という辺りが分からず、どなたかご存知であれば、教えていただきたいです。


CC BY-SA 3.0
2017-11-01T10:58:56.930
39215
2017-11-02T03:13:03.117
2017-11-01T11:14:52.870
8078
8078
question
java java-ee jpa
JPAでデッドロックを検出する方法


EclipseLinkから呼び出される各RDBMS用のJDBCドライバーの実装(どの例外を返すか)に依存しますが、[SQLTransactionRollbackException](https://docs.oracle.com/javase/jp/7/api/java/sql/SQLTransactionRollbackException.html)をcatchするようにしておけば、いいと思います。MySQL
5.1.73の場合は、これを継承する`MySQLTransactionRollbackException`がスローされました。

実際にデッドロックを起こすコードを書いて実験してみると、分かります。

私が書いた記事ですが、参考まで：  
<https://qiita.com/tamura__246/items/d8f168b62617aef6c177>

例外処理はこんな感じでしょうか。

[code]

    } 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);
    }
    
[/code]


CC BY-SA 3.0
2017-11-01T20:30:16.290
39225
2017-11-02T03:13:03.117
2017-11-02T03:13:03.117
21092
21092
39215
answer