注釈が付けられ@Transactional
た(したがってトランザクションを開始する)メソッドがどこかにあり、内部でいくつかのsaveAndFlush()
. たぶん、アノテーションを付けることで独自の(サブ?ネストされた?)トランザクションを開始するメソッドを持つ依存関係を呼び出すことさえあります@Transactional
。トランザクションが途中で失敗した場合、何がロールバックされますか?
いくつかの例:
public class ComplexProcess {
@Inject
private DAO<SomeEntity> someEntityDao;
@Inject
private SomeManagerClass manager;
@Transactional
public void doStuff(SomeEntity entity) {
manager.createAnObjectDependingOnEntity(entity);
entity = someEntityDao.saveAndFlush(entity); // what if this fails?
manager.doMoreStuffDependingOnEntity(entity);
}
}
public class SomeManagerClass {
@Inject
private DAO<SomeObject> someObjectDao;
@Inject
private DAO<SomeOtherEntity> someOtherEntityDao;
// what if this fails?
@Transactional // what if this isn't there?
public void createAnObjectDependingOnEntity(SomeEntity entity) {
SomeObject someObject = createSomeObjectDependingOnEntity(entity);
someObjectDao.saveAndFlush(someObject);
}
// what if this fails?
@Transactional // what if this isn't there?
public void doMoreStuffDependingOnEntity(SomeEntity entity) {
SomeOtherEntity someOtherEntity = whatever(entity);
someOtherEntityDao.safeAndFlush(someOtherEntity);
}
}
繰り返しますが、最後のステップが失敗したとしたら、休止状態は以前に発生したすべてをロールバックしdoStuff()
ますか? そうではないという感覚があるからです。が原因でこの完全なロールバックが不可能な場合、トランザクションの最後に自動フラッシュをsaveAndFlush()
使用して待機するだけで解決しますか? ブロックsave()
を離れる前でも、休止状態が制御不能なフラッシュを独自に実行することを読んだところですか?!@Transactional