springBoot自定义事务管理

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, "", "参数错误");
}
}
原文地址:https://www.cnblogs.com/guanxiaohe/p/11727467.html