Spring事物传播但回滚不成功。
spring吧
全部回复
仅看楼主
level 1
public class PdpDefineController extends BaseController {
@Autowired
private PdpDefineService pdpDefineService;
@RequestMapping(value = "ajaxSave")
@ResponseBody
public String ajaxSave(@破万卷work Map<String, PdpDefine[]> data) {
try {
String pdpVersion = createVersionOrNot(stageVersion);
PdpDefine[] insertData = (PdpDefine[]) data.get("insert");
for (PdpDefine pdpDefine : insertData) {
pdpDefine.setVersion(pdpVersion);
pdpDefineService.save(pdpDefine);
}
PdpDefine[] updateData = (PdpDefine[]) data.get("update");
for (PdpDefine pdpDefine : updateData) {
pdpDefine.setVersion(pdpVersion);
pdpDefineService.save(pdpDefine);
}
int v = 10/0;//这里报异常,被抓取然后用runtimeException替换。
PdpDefine[] deleteData = (PdpDefine[]) data.get("delete");
if (deleteData.length>0) {
pdpDefineService.remove(pdpVersion,deleteData);
}
return "true";
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
其中pdpDefineService.save方法和remove方法注解都为
@Transactional(propagation=Propagation.REQUIRED,readOnly = false)
但是在遇到异常后,前面执行了的部分没有回滚。
急急急!~求大神指点。
2018年11月22日 06点11分 1
level 1
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class,readOnly = false) 这样写试试
2018年11月26日 13点11分 2
level 1
异常并没有被 “捕获” 到这是个很常见的小坑,异常并没有被 “捕获” 到,导致事务并没有回滚。我们在业务层代码中,也许已经考虑到了异常的存在,或者编辑器已经提示我们需要抛出异常,但是这里面有个需要注意的地方:并不是说我们把异常抛出来了,有异常了事务就会回滚。我们来看一个例子:@开心(抄小说,麦手) class UserServiceImpl implements UserService { @resource private UserMapper userMapper; @override @transactional public void isertUser(User user) throws Exception { // 插入用户信息 userMapper.insertUser(user); // 手动抛出异常 throw new SQLException("数据库异常"); }}我们看上面这个代码,其实并没有什么问题,手动抛出一个 SQLException 来模拟实际中操作数据库发生的异常,在这个方法中,既然抛出了异常,那么事务应该回滚,实际却不如此,读者可以自己测试一下就会发现,仍然是可以往数据库插入一条用户数据的。那么问题出在哪呢?因为 Spring Boot 默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。比如上面我们的例子中如果抛出的 RuntimeException 就没有问题,但是抛出 SQLException 就无法回滚了。针对非运行时异常如果要进行事务回滚的话,可以在 @Transactional 注解中使用 rollbackFor 属性来指定异常,比如:@Transactional(rollbackFor = Exception.class)这样就没有问题了,所以在实际项目中,一定要指定异常,这是大部分开发人员不注意的地方。
2019年07月10日 03点07分 3
膜拜大佬!![真棒]!但是我的这问题是我自己理解错了,我是在表示层上调用了3次同样用@Transactional注解修饰的业务层方法,企图在第2,第3个方法调用出现异常的情况下回滚前面的方法。但是这个想法是错误,因为这3个方法调用时独立的,所以不存在后面方法报异常后回滚前面已经提交的事务。[呵呵]
2019年07月15日 08点07分
@肉皇大帝♤ @Transactional(rollbackFor = Exception.class),记住了[吐舌]
2019年07月15日 08点07分
@肉皇大帝♤ 捕获不止RuntimeException,而是发生任何Exception都回滚
2019年07月16日 05点07分
2019年07月16日 13点07分
level 6
自学太盲学,可以了解一下动力节点的实验班,免费试学半个月,之后还免费测试你到底适不适合学Java
2020年01月06日 06点01分 4
1