springboot数据库回滚失败原因
2024-01-10 13:39:17
更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://122.227.135.243:9888
?
今天在用流程启动的时候出现错误,结果相应的事务没有回滚,我主要是用下面语句
@Override
@Transactional(rollbackFor = Exception.class)
public R<Void> startProcessByDataId(String dataId, String serviceName, Map<String, Object> variables) {
//提交审批的时候进行流程实例关联初始化
if (serviceName==null){
return R.fail("未找到serviceName:"+serviceName);
}
WfCustomForm wfCustomForm = wfCustomFormService.selectSysCustomFormByServiceName(serviceName);
if(wfCustomForm ==null){
return R.fail("未找到sysCustomForm:"+serviceName);
}
//优先考虑自定义业务表是否关联流程,再看通用的表单流程关联表
ProcessDefinition processDefinition;
String deployId = wfCustomForm.getDeployId();
if(StringUtils.isEmpty(deployId)) {
WfDeployForm sysDeployForm = deployFormMapper.selectSysDeployFormByFormId("key_"+String.valueOf(wfCustomForm.getId()));
if(sysDeployForm ==null){
return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId());
}
processDefinition = repositoryService.createProcessDefinitionQuery()
.parentDeploymentId(sysDeployForm.getDeployId()).latestVersion().singleResult();
}
else {
processDefinition = repositoryService.createProcessDefinitionQuery()
.parentDeploymentId(deployId).latestVersion().singleResult();
}
try {
LambdaQueryWrapper<WfMyBusiness> wfMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>();
wfMyBusinessLambdaQueryWrapper.eq(WfMyBusiness::getDataId, dataId);
WfMyBusiness business = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper);
if (business==null){
if(processDefinition==null) {
return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId());
}
boolean binit = wfCommonService.initActBusiness(wfCustomForm.getBusinessName(), dataId, serviceName,
processDefinition.getKey(), processDefinition.getId(), wfCustomForm.getRouteName());
if(!binit) {
return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId());
}
WfMyBusiness businessnew = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper);
//流程实例关联初始化结束
if (StrUtil.isNotBlank(businessnew.getProcessDefinitionId())){
return this.startProcessByDefId(businessnew.getProcessDefinitionId(),variables);
}
return this.startProcessByDefKey(businessnew.getProcessDefinitionKey(),variables);
}
else {
return R.fail("已经存在这个dataid实例,不要重复申请:"+dataId);
}
} catch (Exception e) {
e.printStackTrace();
return R.fail("流程启动错误");
}
}
结果实际数据没有回滚。
根据相关资料,由于异常被catch, 不阻断整个事务执行。所以应该是这里出现问题
可以不用try catch,或者就是需要修改如下:
@Override
@Transactional(rollbackFor = Exception.class)
public R<Void> startProcessByDataId(String dataId, String serviceName, Map<String, Object> variables) {
//提交审批的时候进行流程实例关联初始化
if (serviceName==null){
return R.fail("未找到serviceName:"+serviceName);
}
WfCustomForm wfCustomForm = wfCustomFormService.selectSysCustomFormByServiceName(serviceName);
if(wfCustomForm ==null){
return R.fail("未找到sysCustomForm:"+serviceName);
}
//优先考虑自定义业务表是否关联流程,再看通用的表单流程关联表
ProcessDefinition processDefinition;
String deployId = wfCustomForm.getDeployId();
if(StringUtils.isEmpty(deployId)) {
WfDeployForm sysDeployForm = deployFormMapper.selectSysDeployFormByFormId("key_"+String.valueOf(wfCustomForm.getId()));
if(sysDeployForm ==null){
return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId());
}
processDefinition = repositoryService.createProcessDefinitionQuery()
.parentDeploymentId(sysDeployForm.getDeployId()).latestVersion().singleResult();
}
else {
processDefinition = repositoryService.createProcessDefinitionQuery()
.parentDeploymentId(deployId).latestVersion().singleResult();
}
try {
LambdaQueryWrapper<WfMyBusiness> wfMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>();
wfMyBusinessLambdaQueryWrapper.eq(WfMyBusiness::getDataId, dataId);
WfMyBusiness business = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper);
if (business==null){
if(processDefinition==null) {
return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId());
}
boolean binit = wfCommonService.initActBusiness(wfCustomForm.getBusinessName(), dataId, serviceName,
processDefinition.getKey(), processDefinition.getId(), wfCustomForm.getRouteName());
if(!binit) {
return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId());
}
WfMyBusiness businessnew = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper);
//流程实例关联初始化结束
if (StrUtil.isNotBlank(businessnew.getProcessDefinitionId())){
return this.startProcessByDefId(businessnew.getProcessDefinitionId(),variables);
}
return this.startProcessByDefKey(businessnew.getProcessDefinitionKey(),variables);
}
else {
return R.fail("已经存在这个dataid实例,不要重复申请:"+dataId);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
在catch里扔出throw new RuntimeException();,这样就可以回滚成功。
文章来源:https://blog.csdn.net/qq_40032778/article/details/135496987
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!