1.在springBoot項目中service的實現類可以通過注解@Transactional添加事務
2.可以通過設置包名統一設置事務
3.自定義代碼內設置事務
(1).注入事務管理類
@Resource
PlatformTransactionManager platformTransactionManager;
@Resource
TransactionDefinition transactionDefinition;
(2)使用事務
public void saveAgentCert(BaseCertDto dto) { SetDtoUtil.initOtherDto(dto); if (dto.getBaseCerts().size() > 0) { //手動開啟事務 TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition); String certId = null; String vendorId = dto.getVendorId(); try { //這里一定要先獲取到主信息certId 再保存代理信息 所以兩個循環 for (BaseCert cert : dto.getBaseCerts()) { //代理資質資質等級字段,范圍由0-n 前端用於區分代理級別,0代表主資質信息 if (0 == cert.getAgentLevel()) { List<BaseCertFile> baseCertFiles = cert.getBaseCertFiles(); cert.setBaseCertFiles(null); //保存授權資質主信息 BaseCertDto dto1 = new BaseCertDto(); dto1.setBaseCert(cert); save(dto1); certId = dto1.getBaseCert().getCertId(); String fileCertId = certId; //保存授權資質文件信息 saveAuthorCertFileInfo(vendorId, baseCertFiles, fileCertId); } } for (BaseCert cert : dto.getBaseCerts()) { if (0 != cert.getAgentLevel()) { List<BaseCertFile> baseCertFiles = cert.getBaseCertFiles(); cert.setBaseCertFiles(null); //保存授權資質代理信息 BaseAgentCertDto baseAgentCertDto = saveAgentCertInfo(certId, cert); String fileCertId = baseAgentCertDto.getBaseAgentCert().getAgentCertId(); //保存授權資質文件信息 saveAuthorCertFileInfo(vendorId, baseCertFiles, fileCertId); } } //手動提交事務 platformTransactionManager.commit(transactionStatus);//提交 SetDtoUtil.setSuccessDto(dto, "操作成功"); } catch (Exception e) { //手動回滾事務 platformTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序異常而事務一直卡在哪里未提交 logger.error(e.getMessage(), e); SetDtoUtil.setFailDto(dto, "保存失敗", "error"); } } else { SetDtoUtil.setFailDto(dto, "", "參數錯誤"); } }