まず、JPA2インプリメンテーションとしてSpring + Hibernateを使用しています。私のアプリケーションは、JpaTransactionManagerとHibernateJpaDialectで構成されています。アトミック性のネストされたトランザクション(Propogation.REQUIRED_NEW/Propogation.NESTED)
私にはユニットを無効にする機能があり、複数のユニットを無効にする機能があります。ユニットの非アクティブ化作業によって外部サービスが呼び出され、その呼び出しがタイムアウトした場合、またはエラーステータスが返された場合は例外がスローされます。単一のユニットの非アクティブ化が失敗した場合(この外部サービスコールまたはRuntimeExceptionのため)、のトランザクションをロールバックしたいとします。ユニットのみです。
@Transactional
public void deactivateUnits(List<String> names){
for(String name : names){
deactivateUnit(name);
}
}
@Transactional(propogation=Propogation.REQUIRES_NEW, rollbackFor=MyException.class)
public void deactivateUnit(String name) throws MyException{
..snip..
//Some code that throws MyExceptions or RuntimeExceptions
..snip..
}
そして、これは完璧に動作します:
は、私は以下のように、本質的に、この使用Propogation.REQUIRES_NEWを達成することができますよ。
このスタイルは、アクティブ化にも非常によく似ています。
@Transactional
public void activateUnits(List<String> names){
for(String name : names){
activateUnit(name);
}
}
@Transactional(propogation=Propogation.REQUIRES_NEW, rollbackFor=MyException.class)
public void activateUnit(String name) throws MyException{
..snip..
//Some code that throws MyExceptions or RuntimeExceptions
..snip..
}
ただし、reactivation
を実行するときに問題が発生します。私が望むのは、既存のdeactivateUnit
との機能を利用する原子のreactivation
タスクです。deactivateUnit
またはactivateUnit
のいずれかがロールバックすると、関数全体がロールバックされるようになります。この時
私naiive試みは動作しません:
@Transactional(propogation=Propogation.REQUIRES_NEW, rollbackFor=MyException.class)
public void reactivateUnit(String newName, String oldName) throws MyException{
deactivateUnit(oldName);
activateUnit(newName);
}
activateUnit
場合は、ロールバック、deactivateUnit
にはありません。
アクティブ化と非アクティブ化に関する伝播をNESTED
に変更する必要があるかもしれないと考えましたが、機能のロールバック動作は保持されません。
私は紛失しているので、助けていただければ幸いです!