2011-06-22 6 views
8

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

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()のそれはmethodWithRequiredTx()、右@Transactional注釈を有するかどうかに応じて、トランザクション内で実行される@Transactional(propagation = Propagation.SUPPORTS)注釈を有しますか?

繁殖レベルのサポートの必要性/用途は何ですか?

答えて

0

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

+0

私はそうは思わない。伝搬レベルがNEVERでない場合にのみ、エラーがスローされます。また、PROPAGATION.SUPPORTSは新しいトランザクションを作成しません。 –

4

注:同期がために適用されることトランザクションスコープを定義するように、トランザクションの同期とトランザクション・マネージャについては、PROPAGATION_SUPPORTSは、まったくトランザクションとは若干異なります。結果として、同じリソース(JDBC Connection、Hibernate Sessionなど)が指定されたスコープ全体で共有されます。これは、トランザクションマネージャの実際の同期設定に依存することに注意してください。

だから、それは例えば、HibernateのSessionFactory.getCurrentSession()methodWithSupportsTx()内部の複数の呼び出しが同じセッションを返す、ということを意味しています。

+0

methodWithSupportsTx()に@Transactionalアノテーションがないと仮定すると、トランザクションでmethodWithSupportsTx()が呼び出されたときに同じセッションが返されないと言っていますか? –

+0

@Amit:実際には、 '@ Transactional'が' HibernateTransactionManager'の典型的な設定で 'getCurrentSession()'を呼び出そうとすると、 "スレッドにバインドされているHibernateセッションは存在せず、ここで非トランザクションのものを作成することはできません"例外。 – axtavt

+0

いいえ、methodWithSupportsTx()メソッドに@Transactionalアノテーションがなく、このメソッドがすでにトランザクション内にある別のメソッドから呼び出された場合、HibernateのSessionFactory.getCurrentSessionの複数の呼び出しを行って同じセッションを返します()。これはまさに私が上記の私の質問で述べた例です。methodWithRequiredTx()の@Transactionalアノテーションは新しいトランザクションを作成し、次にserviceBean.methodWithSupportsTx()を呼び出します。したがって、methodWithSupportsTx()によって実行されるコードはすでにトランザクションになります。 –

関連する問題