1

プログラムでトランザクションを区切ったコードがあります。

現在、分離を に設定していPROPAGATION_REQUIRES_NEWます。これは正常に機能しますが、再帰的な動作に対応する必要があり、そのために同じスレッドからメソッドが再度呼び出された場合に新しいトランザクションを作成したくありません。

1) メソッドが初めて呼び出された場合、現在のトランザクションを中断し、新しいトランザクションを作成します。PROPAGATION_REQUIRES_NEW

2) 再帰的に呼び出された場合。新しいトランザクションを作成しないでください。

例:私が持っていて、それが機能するのは. 私が望まないのは、entrancy AtomicInterger の使用です。何か案は?

public methoda() {

  Integer entrancy = rentrancy.incrementAndGet(); 

   if(entrancy == 1) { 
          this.transactionTemplate.setPropagationBehavior(..PROPAGATION_REQUIRES_NEW);
   }

   this.transactionTemplate.execute(new TransactionCallback<E>(){
         .......
         .......
   }
   entrancy.decrementAndGet();
}
4

2 に答える 2

1

PROPAGATION_REQUIRED が目的により適しているようです。そのjavadocから:

現在のトランザクションをサポートします。存在しない場合は、新しいものを作成します。

于 2013-02-25T11:58:55.843 に答える
0

今はテストできないため、「回避策」が機能するかどうかはわかりません。ただし、トランザクションの定義にアノテーション(@Transactional)を使用すると、メソッドが外部から呼び出されたときにのみトランザクションが作成されます。メソッドが自分自身を呼び出す場合ではありません。これはプロキシだからです。

「注: このメカニズムはプロキシに基づいているため、プロキシを介して着信する「外部」メソッド呼び出しのみがインターセプトされます。これは、「自己呼び出し」、つまりターゲット オブジェクト内のメソッドがターゲット オブジェクトの他のメソッドを呼び出すことを意味します。 、呼び出されたメソッドが @Transactional でマークされていても、実行時に実際のトランザクションにつながることはありません!" http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

于 2013-02-26T15:06:55.037 に答える