Springトランザクションネストの構成


に質問
Springを使用してサービス・レイヤ・トランザクションを管理する場合、サービス・メソッド・トランザクションがネストされているという問題が発生します.デフォルトでは、サービス・メソッドには独自のトランザクションがあります.複雑なサービス・メソッドで複数のトランザクション・アクションが呼び出されると、トランザクション・ロールバックは発生しません.この場合、ロールバックを完了するには自動的な方法が必要です.
Springのトランザクションメカニズム
PROPAGATION_REQUIRD現在トランザクションがない場合は新規トランザクションを作成し、既にトランザクションが存在する場合はこのトランザクションに追加します.これは最も一般的な選択です.PROPAGATION_SUPPORTSは現在のトランザクションをサポートし、現在トランザクションがない場合は非トランザクションで実行します.PROPAGATION_MANDATORYは現在のトランザクションを使用し、現在トランザクションがない場合は例外を放出します.PROPAGATION_REQUIRES_NEW新規トランザクションを作成し、現在トランザクションが存在する場合は、現在のトランザクションを保留します.PROPAGATION_NOT_SUPPORTEDは非トランザクションで操作を行い、現在トランザクションが存在する場合は現在のトランザクションを保留します.PROPAGATION_NEVERは非トランザクションで実行され、現在トランザクションが存在する場合は例外が放出されます.PROPAGATION_NESTED現在トランザクションが存在する場合は、ネストされたトランザクション内で実行します.現在トランザクションがない場合は、PROPAGATION_と実行します.REQUIRD同様の操作.
トランザクションメカニズム、PROPAGATION_NESTEDという仕組み.
サービスメソッドでこの方法を構成すると
@Transactional(propagation=Propagation.NESTED)
public void save(Entity entity) {
    //        
}

実行後のシステム異常は、現在の構成がNESTEDトランザクションをサポートしていないことを示す.
解決策
いくつかのコードを調べたところ、isNestedTransactionAllowedの判定があるHibernateTransactionManagerで発見されました.
protected Object doGetTransaction() {
    HibernateTransactionObject txObject = new HibernateTransactionObject();
    txObject.setSavepointAllowed(isNestedTransactionAllowed());
    //...
}

だからHibernate構成にnestedTransactionAllowedの構成を追加します

    
    


その後、すべてのトランザクションがネストされたトランザクションを自動的に使用し、サービスのコードと構成を変更する必要もなく、サービスメソッドから削除できます(propagation=Propagation.NESTED).
に注意
PS:Unchecked Exceptionが発生すると、サービストランザクション全体がロールバックされます.(1)Unchecked Exceptionでなければロールバックされません(2)Hibernateセッションのflushメソッドが呼び出されてもロールバックされます