2011-08-02 7 views
0

私は一種の次のようなサービスの実装を持っている:Springの@Transactionalアノテーションを含むメソッドの転送方法ですか?

class FooImpl implements Foo { 

    @Override 
    @Transactional(...) 
    public void doSomething(String baz) { 
     return this.doSomething(Arrays.asList(new String[] { baz })); 
    } 


    @Override 
    @Transactional(...) 
    public void doSomething(List<String> bazList) { 
     // do something crazy 
     return null; 
    } 

} 

私はここで何が起こっているのか、理解したいですか?私は@Transactional注釈(メソッドの転送)と、別の方法から@Transactionalアノテーションでメソッドを呼び出す...

私の質問よ:
私はどんな奇妙な状況を作成する上で持っているものですか?それは正しく動作しているようですので、外部トランザクションが使用されており、新しいトランザクションが作成されていないと思います。これは正しいです?また、どのように私がこれを確認/デバッグすることができるかについてのヒント?

答えて

3

これは一般的な状況です。 @Transactionalpropagationの特性を有する。このプロパティは、@Transactionalメソッドが呼び出されたときの動作(新しいトランザクションが必要かどうか、既存のトランザクションが必要かどうかなど)を定義します。

デフォルトでは、伝播はREQUIREDです。つまり、新しいトランザクションが開始されます。存在しなければ;それ以外の場合は既存のものが使用されます。

Read here about transaction propagation

ここで言及するもう1つの点は、(一部の構成シナリオでは)同じクラスのメソッドを呼び出す場合にトランザクションインターセプタがトリガされないため、伝播がまったく考慮されないことです。あなたの場合、2番目のメソッドの@Transactionalは無視される可能性が最も高いです。

を二@Transactionalも呼び出されることはありません:あなたはJDKプロキシを使用していると仮定すると、

1

。 AOPにJDKプロキシを使用すると、アドバイスはプロキシされたBeanに対して呼び出しが行われたときにのみメソッドに適用されます。同じクラスの別のメソッドを呼び出すと、Beanを作成する際にメソッドが春に「ラップする」コードを通さずに呼び出しが行われます。それが必要な場合は、作成したBeanプロキシへの参照をApplicationContextに問い合わせる必要があります。

脇に、Collections,singletonList

+0

ああ、シングルトンリストの岩!ありがとう、私はまだJavaの土地に少し新しいです。 – Polaris878

関連する問題