0

first->second-> third を呼び出す 3 つの Spring コンポーネントがあります。1 番目と 3 番目に @Transactional アノテーションしかない場合、トランザクションは適切に伝播されますか?

@Component public class C1 {
  @Autowired C2 c2;

  @Transactional public method1() {
    ...
    c2.method2();
  }
}

@Component public class C2 {
  @Autowired C3 c3;

  public method2() {
    ...
    c3.method3();
  }
}

@Component public class C3 {
  @Transactional public method3() {
    ...
  }
}
4

2 に答える 2

1

@Transactional は以下のように機能します

いずれかのメソッドでマークされている場合は、その値がデフォルトで Required または RequiredNew になる可能性がある、propagation と呼ばれる属性を指定できます。

サンプルは @Transactional(readOnly = true,propagation=Propagation.REQUIRES_NEW) public void somemethod(){

別の方法();

}

属性がデフォルトである「必須」の場合、各メソッドで @transactional を宣言するかどうかに関係なく、すべてのメソッドの全体的な伝播に対して単一のトランザクションを維持します。

したがって、すべてのメソッドの実行は同じトランザクションの下で行われ、最後のメソッドでロールバックが発生すると、呼び出されたメソッドまで影響します。

属性が「RequiredNew」に設定されている場合、各メソッドは独自のトランザクションで実行されるため、1 つのメソッドでロールバックしても他のメソッドのトランザクションはロールバックされません。

あなたが今はっきりしていることを願っています

于 2013-10-09T03:21:17.240 に答える
1

はい、Transactionサポートはスレッド バウンドです。がmethod2()実行されると、同じように実行されるためThread、現在の にアクセスできますTransaction。についても同様ですmethod3()

于 2013-10-09T03:19:04.980 に答える