UPD 1:JPA:ネストされたトランザクションの方法はロールバックされません
- 私はWildFly 9.0.2にJNDIルックアップを通じてデータソースを取得し、その後、「ラップ:私は、以下の情報が役に立つかもしれないと思うさらなる研究の際それは例えば
HikariDataSource
(例えば、return new HikariDataSource(jndiDSLookup(dsName))
)に入ります。 - 最終的に使用されるトランザクションマネージャは
JTATransactionManager
です。 - 私はトランザクションマネージャを設定しません。
元の質問:
私はJPA/HibernateとDBの変更が別のクラスのトランザクションメソッドから呼び出された一つのクラスのトランザクションの方法で導入された(多分)春ブートで問題が発生しています呼び出し元メソッドの変更がロールバックされていても(コミットされるはずです)、コミットされます。ここで
は私のトランザクションサービスは
StuffService
です:
@Service
@Transactional(rollbackFor = IOException.class)
public class StuffService {
@Inject private BarService barService;
@Inject private StuffRepository stuffRepository;
public Stuff updateStuff(Stuff stuff) {
try {
if (null != barService.doBar(stuff)) {
stuff.setSomething(SOMETHING);
stuff.setSomethingElse(SOMETHING_ELSE);
return stuffRepository.save(stuff);
}
} catch (FirstCustomException e) {
logger.error("Blah", e);
throw new SecondCustomException(e.getMessage());
}
throw new SecondCustomException("Blah 2");
}
// other methods
}
とBarService
:
@Service
@Transactional
public class BarService {
@Inject private EntityARepository entityARepository;
@Inject private EntityBRepository entityBRepository;
/*
* updates existing entity A and persists new entity B.
*/
public EntityA doBar(Stuff stuff) throws FirstCustomException {
EntityA a = entityARepository.findOne(/* some criteria */);
a.setSomething(SOMETHING);
EntityB b = new EntityB();
b.setSomething(SOMETHING);
b.setSomethingElse(SOMETHING_ELSE);
entityBRepository.save(b);
return entityARepository.save(a);
}
// other methods
}
EntityARepository
とEntityBRepository
は、次のように定義された非常によく似春ブーツのリポジトリです:
public interface EntityARepository extends JpaRepository<EntityA, Long>{
EntityA findOne(/* some criteria */);
}
FirstCustomException
はThrowable
SecondCustomException
を拡張延びRuntimeException
Stuff
エンティティがバージョン管理され、そしてすべてのたまにそれを同時にStuffService.updateStuff()
によって更新されます。その場合、stuff
インスタンスの1つへの変更は、予想どおりにロールバックされますが、barService.doBar()
で発生したすべてがコミットされます。
両方のメソッドでのトランザクションの伝達がREQUIRED
(デフォルトのもの)で、両方のメソッドが異なるクラスに属しているので、これは非常に困惑します。したがって、@Transactional
を両方に適用する必要があります。
私はTransaction is not completely rolled back after server throws OptimisticLockException1
を見やった。しかし、それは本当に私の質問に答えませんでした。
誰でも私に何が起こっているのか考えてもらえますか?
ありがとうございます。
サービスのいずれかでロールバックが発生するエラー/例外はありますか。 – Mubin
@Mubin: 'OptimisticLockException'は' StaleObjectStateException'によってかなり予想通りに引き起こされます。 – kooker