3

私はこのような方法を持っています:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeWork(){
 Entity = entity = dao.loadEntity();
 // do some related work
 ...
 try {
  dao.saveEntity(entity);
 }
 catch(StaleObjectStateException sose){
  dao.flush(entity);
  doSomeWork();
 }
}

REQUIRES_NEWトランザクションの伝播と示されている再帰を使用することで、StaleObjectStateExceptionが最終的にクリアされることを期待していましたが、そうではありません。

この例外から回復するにはどうすればよいですか?

4

1 に答える 1

7

私が見落としていた「ガチャ」が少しあることがわかりました...

春のドキュメントから

プロキシモード(デフォルト)では、プロキシを介して着信する「外部」メソッド呼び出しのみがインターセプトされます。つまり、「自己呼び出し」、つまりターゲットオブジェクト内のメソッドがターゲットオブジェクトの他のメソッドを呼び出すと、呼び出されたメソッドが@Transactional!でマークされていても、実行時に実際のトランザクションが発生することはありません。

私は内部で繰り返しを行っているため、トランザクションの境界は適用されていませんでした。

解決策は、次のようにプロキシを介して再帰することです...

@Autowired
private ApplicationContext applicationContext;

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeWork(){
 Entity = entity = dao.loadEntity();
 // do some related work
 ...
 try {
  dao.saveEntity(entity);
 }
 catch(StaleObjectStateException sose){
  dao.flush(entity);
  applicationContext.getBean(this.getClass()).doSomeWork();
 }
}
于 2012-09-03T19:29:54.930 に答える