Ich habe folgendes Service Layout verschachtelte Transaktionen:Transfer abbrechen Alle DB Commits in geschachtelte Transaktionen im Frühjahr
@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
}
}
Ich brauche alle machen die DB-Anrufe innerhalb ServiceA
und ServiceB
verschachtelte Aufrufe Rollback, wenn ServiceC#methodC()
eine Ausnahme auslöst (oder irgendeine von denen, die eine Ausnahme auslöst - ServiceA
oder ServiceB
).
Ich habe versucht, Main#outerMethod
transaktional mit REQUIRED
Ausbreitung zu machen, aber es scheint, als ob die Datenbank-Commits nicht zurückgerollt werden. Ich habe sogar die spezifischen Klassen mit rollbackFor
spezifiziert, aber die commits bestehen fort. Kann jemand dieses Problem beheben?
Warum setzen Sie innerMethodThree nicht in dieselbe Transaktion wie innerMethod_1a und 2a? – Simon
@Simon Wie erreiche ich das? 'innerMethodThree' muss nach 1) und 2) aufgerufen werden. – NuCradle
setze @Transactional auf die äußere Methode und brauche keine neue für 1a und 2a – Simon