gpt4 book ai didi

java事务回滚失败问题分析

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章java事务回滚失败问题分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因.

一切还是要从Java的检查型异常和非检查型异常说起.

那么什么是检查型异常什么又是非检查型异常呢?

最简单的判断点有两个:

1.继承自RuntimeException或Error的是非检查型异常,而继承自Exception的则是检查型异常(当然,RuntimeException本身也是Exception的子类).

2.对非检查型类异常可以不用捕获,而检查型异常则必须用try……catch语句块进行处理或者把异常交给上级方法处理,总之就是必须写代码处理它.

Java的异常结构如下图。其中直接继承Exception的异常,必须捕获,属于检查型异常.

java事务回滚失败问题分析

再回过来看我的代码:

1、方法名前面有 。

java" id="highlighter_690519">
?
1
@Transactional

2、Spring的配置文件applicationContext-XXX.xml当中也有Spring事物的相关配置 。

?
1
2
3
4
5
< bean id = "transactionManager"
   class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
   < property name = "dataSource" ref = "dataSource" />
   < property name = "rollbackOnCommitFailure" value = "true" ></ property >
</ bean >

但是为什么在Service层方法调用的时候,try……catch抛Exception异常已经提交的事物却没有回滚?

查看相关spring的文档后发现,原来spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作.

代码中try……catch抛出的Exception异常,属于检查型异常,Spring的框架默认是不会进行回滚的.

在编程中对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它.

所以必须在service捕获异常,然后再次手动throw一个非检查型异常,这样事务方才起效。例如:

?
1
2
3
4
5
6
try {
   …………
} catch (Exception e) {
   …………
   throw new BusinessException(e.getMessage());
}

当然我们还有更简便的方法来解决这个问题,那就是通过注解参数改变默认的回滚方式.

在@Transaction注解中定义了noRollbackFor和RollbackFor来指定某种异常是否回滚.

使用例:

@Transaction(noRollbackFor=RuntimeException.class) 。

@Transaction(RollbackFor=Exception.class) 。

所以上述的问题可以直接将@Transaction添加回滚参数@Transaction(RollbackFor=Exception.class),这样就改变了默认的事务处理方式.

启示

这就要求我们在自定义异常的时候,让自定义的异常继承自RuntimeException,这样抛出的时候才会被Spring默认的事务处理准确处理.

总结 。

以上就是本文关于java事务回滚失败问题分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。

原文链接:http://blog.csdn.net/qq_34406670/article/details/78945962 。

最后此篇关于java事务回滚失败问题分析的文章就讲到这里了,如果你想了解更多关于java事务回滚失败问题分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com