@Service
public class serverone {
@Autowired
private BizTradeChargeDyDao bizTradeChargeDyDao;
@Autowired
private BizTradeRefundDyDao bizTradeRefundDyDao;
public void sws() {
try {
sw1();
}catch (Exception e){
System.out.println("error");
}
}
@Transactional
public void sw1() {
BizTradeChargeDy bizTradeChargeDy = new BizTradeChargeDy();
bizTradeChargeDy.setOrderId("testsw1");
bizTradeChargeDyDao.insert(bizTradeChargeDy);
sw2();
}
@Transactional
public void sw2() {
BizTradeRefundDy bizTradeRefundDy = new BizTradeRefundDy();
bizTradeRefundDy.setRefundId("testsw2");
bizTradeRefundDyDao.insert(bizTradeRefundDy);
this.exc();
}
public void exc() {
throw new RuntimeException("testsw");
}
}
如上图所示如果我们在外部调用sws方法,虽然他上面没有@Transactional注解,我们直观的感觉是事务是从调用sw1时候开启的,虽然sws中捕获异常并消化掉了,但是sw1本省开启的事务能捕获异常,以为事务是会回滚的,但事实是事务并不会回滚,而是被同类中方法sws捕获消化了,如果想要异常回滚事务并且内部消化处理掉异常需要把捕获异常的方法和事务方法拆分到两个不同的类中,上边可以将sws方法单独抽出到顶一个class中进行调用这个类的sw1方法,就可以做到异常时事务回滚并且外层自己控制消化掉了异常,如下代码:
@Service
public class serverone {
@Autowired
private servertwo servertwo;
public void sws() {
try {
servertwo.sw1();
}catch (Exception e){
System.out.println("error");
}
}
}
@Service
public class servertwo {
@Autowired
private BizTradeChargeDyDao bizTradeChargeDyDao;
@Autowired
private BizTradeRefundDyDao bizTradeRefundDyDao;
@Transactional
public void sw1() {
BizTradeChargeDy bizTradeChargeDy = new BizTradeChargeDy();
bizTradeChargeDy.setOrderId("testsw1");
bizTradeChargeDyDao.insert(bizTradeChargeDy);
sw2();
}
@Transactional
public void sw2() {
BizTradeRefundDy bizTradeRefundDy = new BizTradeRefundDy();
bizTradeRefundDy.setRefundId("testsw2");
bizTradeRefundDyDao.insert(bizTradeRefundDy);
this.exc();
}
public void exc() {
throw new RuntimeException("testsw");
}
}