1

まず、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に変更する必要があるかもしれないと考えましたが、機能のロールバック動作は保持されません。

私は紛失しているので、助けていただければ幸いです!

答えて

0

この場合、最初に注釈を付けたdeactivateUnit関数を使用することはできません。 REFERIRES_NEWでラッパー関数を使用すると、注釈のないヘルパー関数が呼び出される可能性があります。次に、reactivateUnitメソッドでヘルパー関数を呼び出すこともできます。