基于注解的事务处理,默认的是check exception不会回滚,unchecked exception会回滚,工作中遇到了关于事务处理的问题,
如下:
@Transactional public ManualReport copy(ManualReport from, ManualReport to) { //记录复制的manual_reportId long copyId = from.getId(); to = from; try { ManualReport manualReportCopyResult = null; if(to.getSendType().equals(ManualReportEnum.ManualReportSendType.INSTANT.value)){ manualReportCopyResult = new ManualReport(System.currentTimeMillis(), to.getMailReceivers(),to.getSmsReceivers(),to.getSendType(), to.getName()+"复制",ReportEnums.SendStatus.waitSend.value,
to.getWeChatReceivers(),ManualReportEnum.ManualReportStatus.EDIT.value, to.getSendTime(),to.getUserToken()); }else { manualReportCopyResult = new ManualReport(System.currentTimeMillis(), to.getMailReceivers(),to.getSmsReceivers(),to.getSendType(), to.getName()+"复制",ReportEnums.SendStatus.willSend.value,
to.getWeChatReceivers(),ManualReportEnum.ManualReportStatus.EDIT.value, to.getSendTime(),to.getUserToken()); } ManualReport manualReport = this.save(manualReportCopyResult); //记录复制后的id long reportId = manualReport.getId(); copyPanel(copyId, reportId); return manualReport; } catch (Exception e) { logger.error("copy Manual Report Error: {}",copyId, e); } }
在调试的时候,写一个NullException,由于在try...catch(){}中已经捕获,所以即使有异常也
不会执行事务的回滚操作,
如果想要执行事务的回滚操作,则在catch中throw new RuntimeException(),