2017-03-20 21 views
1

A.javaをキャッチしていない春休止状態:@Transaction(REQUIRES_NEW)例外

try{ 
for(i=1;i<=5;i++){ 
List<Integer> intList = new ArrayList(); 
bService.executeMethod(i,intList); 
} 
}catch(Exception e){ 
logger.error("exception occoured {}",e); 
} 

B.java

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void executeMethod(int i, List<Integer> intList){ 
try{ 
.......dostuff; 
}catch(Exception e){ 
strList.add(i) 
} 
} 

何かが間違ってexecuteMethod(いけば)反復のいずれかについては、私がすることができます= 2(一部の休止状態の例外がcatchブロックで捕捉されていない場合)、残りの反復値i = 3〜i = 5に対してもコードは実行されます。

キャッチブロック(Excetionクラスを使用している)にキャッチされるべき例外はありますが、それは起こりません。なぜ私はそれが起こっているのか考えていない、誰かが私にこれを手伝ってもらえるだろうか?

OptimisticLockExceptionががスローされ、そのが

答えて

1

を終了ばかり反復の残りの部分の実行せずにされているが、あなたは、トランザクションの例外をヒットされていませんか? doStuffで何かが発生した場合、トランザクションが破損して無効とマークされることがあります。 executeMethodを終了するとすぐに、Springはトランザクションをコミットしようとし、失敗して別の例外(プロキシ内)を投げます。

デバッグレベルの場合は、常に例外を記録する必要があります。また、トランザクション例外をキャッチする場合は、呼び出し元でそれを行う必要があります。

プロキシを通じてスローされた例外は、トランザクションを適切にロールバックします。それを捕まえて無視するので、エラーはSpringに隠されます。

+0

変更されたコードビット@Guillaume F. – MAX

+0

呼び出し元の 'try catch'はループ内にあるべきです。 –