I持つネストされたトランザクションの次のサービスレイアウト:私はServiceC#methodC()
が例外をスローした場合、すべてのDBがServiceA
とServiceB
ネストされた呼び出しの中にロールバックする呼び出しを行う必要があるロールバックすべてのDBは春
@Component
public class Main implements RPCInterface {
@Autowired
private ServiceA serviceA;
@Autowired
private ServiceB serviceB;
@Autowired
private ServiceC serviceC;
@Override
@Transactional (value="txManager", propagation=Propagation.REQUIRED, rollbackFor={ExceptionOne.class, ExceptionTwo.class, ExceptionThree.class})
public void outerMethod() throws ExceptionO {
try {
serviceA.methodA();
serviceB.methodB();
serviceC.methodC();
} catch (ExceptionOne e) {
throw new ExceptionO(e.getMessage, e);
} catch (ExceptionTwo e) {
throw new ExceptionO(e.getMessage, e);
} catch (ExceptionThree e) {
throw new ExceptionO(e.getMessage, e);
}
}
}
@Service
public class ServiceA implements SA {
@Autowired
private ServiceA1 serviceA1;
@Override
public void methodA() {
serviceA1.methodA1();
}
}
@Service
public class ServiceA1 implements SA1 {
@Autowired
private ServiceDBTable1 serviceDBTable1;
@Autowired
private ServiceA1A serviceA1A;
@Transactional
@Override
public void methodA1() {
serviceDBTable4.callToMapper4();
serviceA1A.methodA1A();
}
}
@Service
@Transactional (value="txManager", propagation=Propagation.REQUIRED)
public class ServiceA1A implements SA1A {
@Autowired
private ServiceDBTable2 serviceDBTable2;
@Override
public void methodA1A() {
serviceDBTable1.callToMapper1();
}
}
@Service
public class ServiceB implements SB {
@Autowired
private ServiceDBTable3 serviceDBTable3;
@Override
@Transactional (value="txManager", propagation=Propagation.REQUIRED)
public void methodB() {
serviceDBTable3.callToMapper3();
}
}
@Service
public class ServiceC implements SC {
@Override
public void methodC() throws ExceptionThree {
// code that throws ExceptionThree
}
}
(または例外をスローするそのようなもののいずれか - ServiceA
またはServiceB
)。
私はMain#outerMethod
とトランザクションをREQUIRED
と伝えようとしましたが、データベースコミットがロールバックされていないようです。私はrollbackFor
で特定のクラスを指定しましたが、コミットは持続します。誰もこの問題を解決する方法を知っていますか?
なぜinnerMethodThreeをinnerMethod_1aと2aと同じトランザクションに入れないのですか? – Simon
@サイモンどのように私はそれを達成するのですか? 'innerMethodThree'は1)と2)の後に呼び出さなければなりません。 – NuCradle
outerMethodに@Transactionalを設定し、1aと2aのためにnewを必要としません。 – Simon