【前提】:嵌套事务。事务doProcess方法的中调用事务update方法,且可以捕获update方法中抛出的异常,问:doProcess方法既然可以捕获异常,那还会发生回滚操作么?
【代码】:
@Service
public class TestReqJsonProcess implements JsonProcessInterface {
private Logger logger = LoggerFactory.getLogger( getClass() );
@PersistenceContext
private EntityManager em;
@Autowired
private ServJsonUtil servDocUtil;
@Autowired
private BusiOptUtil busiOptUtil;
@Autowired
private RTmAppMain rTmAppMain;
@Transactional
public ServiceDoc doProcess( ServiceDoc servReq ) throws ProcessException {
logger.debug("--------------执行开始-外部事务--------------");
try {
TestReqRequest request = new TestReqRequest();
servDocUtil.setBeanProperty( servReq, request );
String appNo = request.getAppNo();
String remark = request.getRemark();
QTmAppMain qTmAppMain = QTmAppMain.tmAppMain;
TmAppMain tmAppMain = new JPAQuery( em ).from( qTmAppMain )
.where( qTmAppMain.appNo.eq( appNo ) )
.singleResult( qTmAppMain );
tmAppMain.setRemark(remark);
rTmAppMain.save(tmAppMain);
logger.debug("外部事务保存对象完成!");
busiOptUtil.update(appNo, remark);
} catch (Exception e) {
e.printStackTrace();
}
logger.debug("--------------执行结束-外部事务--------------");
return servReq;
}
}
@Component
public class BusiOptUtil {
Logger logger = LoggerFactory.getLogger( this.getClass() );
@PersistenceContext
private EntityManager em;
@Autowired
private RTmAppMain rTmAppMain;
@Autowired
private RTmAppPrimApplicantInfo rTmAppPrimApplicantInfo;
@Transactional
public void update(String appNo, String remark){
QTmAppPrimApplicantInfo qTmAppPrimApplicantInfo = QTmAppPrimApplicantInfo.tmAppPrimApplicantInfo;
TmAppPrimApplicantInfo info = new JPAQuery( em ).from( qTmAppPrimApplicantInfo ).where(
qTmAppPrimApplicantInfo.appNo.eq( appNo ))
.singleResult( qTmAppPrimApplicantInfo );
info.setCarUse(remark);
rTmAppPrimApplicantInfo.save(info);
logger.dubug("内部事务保存对象完成");
logger.dubug("执行完了作一下"+1/0);
}
}
【结果】:运行后发现update回滚,同时doProcess方法也发生了回滚。
【分析】:
1.外部起事务,内部起事务,内外都有Try Catch
内部出错:内部和外部事务都不回滚。
外部出错:内部和外部事务都不回滚。
2.外部起事务,内部起事务,当内部没有Try Catch
内部出错:内部和外部事务都回滚。
外部出错:内部和外部事务都不回滚。
3.外部起事务,内部不起事务,内外都有Try Catch
内部出错:内部和外部事务都不回滚。
外部出错:内部和外部事务都不回滚。
4.外部起事务,内部不起事务,当内部没有Try Catch
内部出错:内部和外部事务都不回滚。
外部出错:内部和外部事务都不回滚。
5.外部不起事务,内部起事务,内外都有Try Catch
内部出错:内部不回滚,外部非事务。
外部出错:内部不回滚,外部非事务。
6.外部不起事务,内部起事务,当内部没有Try Catch
内部出错:内部回滚,外部事务不回滚。
外部出错:内部不回滚,外部非事务。