java回滚失败_java事务回滚失败问题分析
Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。
一切还是要从Java的检查型异常和非检查型异常说起。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自RuntimeException或Error的是非检查型异常,而继承自Exception的则是检查型异常(当然,RuntimeException本身也是Exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try……catch语句块进行处理或者把异常交给上级方法处理,总之就是必须写代码处理它。
Java的异常结构如下图。其中直接继承Exception的异常,必须捕获,属于检查型异常。
再回过来看我的代码:
1、方法名前面有
@Transactional
2、Spring的配置文件applicationContext-XXX.xml当中也有Spring事物的相关配置
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
但是为什么在Service层方法调用的时候,try……catch抛Exception异常已经提交的事物却没有回滚?
查看相关spring的文档后发现,原来spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
代码中try……catch抛出的Exception异常,属于检查型异常,Spring的框架默认是不会进行回滚的。
在编程中对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。
所以必须在service捕获异常,然后再次手动throw一个非检查型异常,这样事务方才起效。例如:
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事务回滚失败问题分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
java回滚失败_java事务回滚失败问题分析相关推荐
- mysql 事务回滚语句_数据库事务回滚语句-sql事务回滚语句是-用于事务回滚的sql语句...
sql 回滚语句 这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份 或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进 ...
- Java后端之数据库操作事务回滚
什么是事物 事物是应用程序中一系列操作,事物完成是指所有的操作都完成,事物不完成是指一个操作也不能完成,事物结束有两种情况,当事务中的所有步骤全部完成时,事务提交,如果一个步骤失败,则发生回滚操作,撤 ...
- mysql的回滚机制_mysql事务回滚机制概述
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码: 2 连接数据库,验证密码: 3 验证成功,获得用户信息,比如存款余额等: 4 用户输入需要取款的金额,按下确认键: ...
- php 事务回滚,php实现事务回滚的方法
这篇文章主要介绍了php事务回滚简单实现方法,结合实例形式分析了php事务的定义.提交及回滚事务的具体操作技巧,需要的朋友可以参考下 本文实例讲述了php事务回滚简单实现方法.分享给大家供大家参考,具 ...
- java语言 回文判断_java判断回文字符串的几种方法
java判断回文字符串几种简单的实现: 1.将字符串倒置后逐一比较,实现如下: public class HuiWenTest { /** * @SERLIN */ public static voi ...
- 分析java 线程占用内存_Java线程:保留的内存分析
分析java 线程占用内存 本文将为您提供一个教程,使您可以确定活动应用程序Java线程中保留了多少Java堆空间 . 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究,以使您 ...
- spring mysql 事务回滚失败_Spring事务回滚失败
我在Service层里面调用两个Dao层的方法.一个方法用于储存一行Investor数据,一个方法用于储存和有Investor主键的Address数据.service层方法如下,注意Investor继 ...
- sqlsever回滚操作_SqlServer 事务回滚(1)
SQL事务 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为 ...
- php mysql 数据回滚,PHP mysql事务回滚操作实例_PHP教程
public function insertUser ($userArray){ foreach ($userArray as $key => $value) { @$field .= &quo ...
- java计算10年复利_Java 量化回撤幅度 求复利次数 求任意底的对数
比如 399106 2014年10月9日 上涨幅度35%,从4月28日算起 复利后的净值1.35 ATR60 = 1.249%(百分比) log 1.35 = 0.300104592450338080 ...
最新文章
- 2012届华为校园招聘机试题
- Activity-Service-Receiver-Provider
- 张善友:自由之精神,中国之队长
- mysql timestamp排序_对多个表进行排序MYSQL TimeStamp
- 多个蓝牙缺陷可使攻击者假冒合法设备
- 联合索引会创建几个索引_联合索引在B+Tree上的存储结构及数据查找方式
- mysql 临时表 主键_MySQL临时表
- [nsis]安装包反编译
- 2022年PMP考试应该注意些什么?
- 电子电路基础 (13)——数字电路基础 - 逻辑电路
- 内容市场的2017年:五件大事,每件事都惊心动魄
- 机器学习评估指标 - f1, precision, recall, acc, MCC
- Wifi热点java_Wifi热点实现文件传输
- 环信服务器发送消息,环信服务器发送消息
- OpenCV+OCR文字识别
- 100G QSFP28 CLR4单模光模块的介绍及对比
- 计算机的创新知识,创新高中计算机知识学习的策略分析
- AE开发中“无法嵌入互操作类型*****,请改用适用的接口”解决办法
- 小程序开发问题之textarea层次问题
- android实现新闻内容显示功能,Android开发实现自定义新闻加载页面功能实例