java - 如何在Spring中分离两个相互调用的事务
问题描述
我有一个从事务 A 到事务 B 的调用并且事务 B 失败,如何仅在事务 B 中回滚而不在事务 A 中回滚
@Autowired
ResourceServiceImpl resourceService;
// transaction A
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = RuntimeException.class)
void syncRestApi() {
for (RoleResourceRelation roleResourceRelation : roleResourceRelations) {
roleResourceRelationMapper.save(roleResourceRelation);
}
//call transaction B
try {
resourceService.test();
} catch (Exception e) {
}
}
@Service
@Transactional
public class ResourceServiceImpl {
//transaction B
public void test(){
throw new RuntimeException("");
}
}
谢谢你
解决方案
您在 B 中抛出 RuntimeException 将导致 A 回滚事务。
所以你必须在A中捕获这个异常或者你必须将RuntimeException配置为不回滚(noRollbackFor),但这不是一个好主意,因为这可能会导致问题。
推荐阅读
- oracle - Oracle 将权限授予一组用户和某些数据
- excel - 从字典键中获取特定项目值
- google-sheets - 谷歌表格 - 根据公式内的另一个单元格值设置行号?
- django - docker-compose 问题 - 芹菜容器无法访问数据库容器
- c# - 返回类型为“字符串”的函数返回一个可为空的字符串(即“字符串?”)
- firebase - Firebase Auth:如何使 admin.auth().importUsers 匹配 auth.createUserWithEmailAndPassword?
- git - 如何删除未推送的 git 提交,同时保留其他好的提交?
- javascript - 从 javascript 从数据库中检索用户
- python - 如何使用 Selenium 和 Python 在 web.whatsapp.com 中单击用户名
- kubernetes-dashboard - 无法登录 Kubernetes 仪表板?