11

Propagation Supports との春の取引の使用について理解を深めたいと思います。Java ドキュメントでは@Transactional(propagation = Propagation.SUPPORTS)、トランザクション内から呼び出されたメソッドはトランザクションをサポートしますが、トランザクションが存在しない場合、メソッドは非トランザクションで実行されると記載されています。

に関係なく、これはすでにSpringトランザクションの動作ではありませんPropagation.SUPPORTSか?



public class ServiceBean {

    @Transactional(propagation = Propagation.SUPPORTS)
    public void methodWithSupportsTx() {
        //perform some database operations
    }
}

public class OtherServiceBean {

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodWithRequiredTx() {
        //perform some database operations
        serviceBean.methodWithSupportsTx();
    }
}


上記のコード例では、アノテーションの有無に関係なく、methodWithSupportsTx()アノテーションの有無に@Transactional(propagation = Propagation.SUPPORTS)応じてトランザクションで実行されますよね?methodWithRequiredTx()@Transactional

では、伝播レベルをサポートする必要性/用途は何ですか?

4

2 に答える 2

5

javadocから:

注: トランザクション同期を使用するトランザクション マネージャーの場合、PROPAGATION_SUPPORTS は、同期が適用されるトランザクション スコープを定義するため、トランザクションがまったくない場合とは少し異なります。結果として、同じリソース (JDBC 接続、Hibernate セッションなど) が指定されたスコープ全体で共有されます。これは、トランザクション マネージャーの実際の同期構成に依存することに注意してください。

したがって、たとえば、Hibernate のSessionFactory.getCurrentSession()内部を複数回呼び出すとmethodWithSupportsTx()、同じセッションが返されることを意味します。

于 2011-06-22T09:48:02.567 に答える
-2

必要なトランザクションは、存在しない場合、新しいトランザクションを作成します。したがって、serviceBean.methodWithSupportsTx() を呼び出すと、新しいトランザクションが作成されます。メソッドが本当にトランザクション対応である場合、トランザクションが存在しない場合、Spring からエラーが表示されます。

于 2011-06-22T09:45:34.323 に答える