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, "", "参数错误"); } }