Spring对待事物的实现有一个标签可以使用@Transactional标签来实现事务的管理,但是在使用的时候很多人不清楚实现的原理而使用了错误的使用方式,导致日志里的确是打印了,但是方法的确没有回滚。

我在遇到问题的时候发生了这样的问题,就先去了解下Java中导致程序出现的情况都有哪些

首先Java中的将会导致程序出错的各种情况统称为Throwable,它有两个重要的子类:Exception和Error,二者都是Java异常处理的重要类。

Error是程序已无法处理的异常,与程序员编码无关,是JDK内部出现的问题,一般都是很严重的错误。

Exception是程序自身能处理的异常。

这些异常基本都是可以在编译器发现的,但是除了Exception的一个子类叫做RunTimeException,这个异常只有在运行的过程中才会出现,我们的Try/catch语句,就是为了捕获这种RunimeException,并且处理它,然而我们应该已经被处理的异常是不会再向上抛出的,因为我们已经在这层解决好了,所以一般我们会继承Exception类,把遇到的异常抛出,从而使得Spring的事务管理机制可以捕获到异常,然后回滚。

所以说我们在使用@Transactional进行实现事务的时候,尽量不用Try/catch语句,把异常向上抛出即可。

在别人的博客上我看到了一段代码可以让我很好的理解 :

这段代码,因为已经处理了异常,所以Spring的事务就捕获不到异常信息,导致事务回滚失败

  1. if(userSave){
  2. try {
  3. userDao.save(user);
  4. userCapabilityQuotaDao.save(capabilityQuota);
  5. } catch (Exception e) {
  6. logger.info("能力开通接口,开户异常,异常信息:"+e);
  7. }
  8. }

下面的这种情况,当一个方法出错,抛出一个异常,另一个方法就会回滚:

使用throws关键字把try/catch捕获的异常再一次抛出去

  1. if(userSave){
  2. try {
  3. userDao.save(user);
  4. userCapabilityQuotaDao.save(capabilityQuota);
  5. } catch (Exception e) {
  6. logger.info("能力开通接口,开户异常,异常信息:"+e);
  7. throw new RuntimeException();
  8. }
  9. }
使用它同样可以达到相同的效果
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 语句,
手动回滚,这样上层就无需去处理异常(现在项目的做法) 
  1. if(userSave){
  2. try {
  3. userDao.save(user);
  4. userCapabilityQuotaDao.save(capabilityQuota);
  5. } catch (Exception e) {
  6. logger.info("能力开通接口,开户异常,异常信息:"+e);
  7. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  8. }
  9. }

转载于:https://www.cnblogs.com/Shang-Jun/p/7635794.html

Spring对事物的实现相关推荐

  1. 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

    由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,op ...

  2. Spring的事物管理及应用

    事物是用来做什么的? 主要是对数据库进行事务管理,spring的事务主要用来管理spring所加载的ORM(Hibernate.Mybatis.MybatisPlus...)框架 1.@Transac ...

  3. 解决spring的事物注解失效问题

    在开发过程中,spring的申明式事物可能出现,在同样的代码,在测试类中可实现事物回滚效果,正式程序中事物回滚效果失效. 这一块可能就是在事物扫描过程中@transaction注解失效的原因.只要修改 ...

  4. spring的事物配置

    1 配置事物管理器 <bean id="transactionManager" class="org.springframework.jdbc.datasource ...

  5. spring mysql事物级别_mysql事务级别和spring中应用

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  6. Spring : Spring @Transactional事物创建

    1.美图 2.前文回顾 先来回顾一下事物创建的代码片段: try {boolean newSynchronization = (getTransactionSynchronization() != S ...

  7. Spring boot 事物管理

    原文  http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...

  8. spring中事物的隔离级别

    2019独角兽企业重金招聘Python工程师标准>>> 一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样 ...

  9. Spring : Spring @Transactional 事物管理入口

    1.美图 2.概述 3.案例 @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception. ...

最新文章

  1. linux 设置开机命令提示符,centos设置开机默认命令行启动
  2. Facebook大牛、HipHop作者赵海平加入阿里巴巴
  3. Gulp在前端的常用操作实例
  4. java 当天唯一ids_java-为不同的时间字符串接收相同的ZonedDat...
  5. The authenticity of host 'github.com (52.74.223.119)' can't be established.
  6. xen-tools创建虚拟机找不到root fs的解决办法
  7. (12)机器学习_特征选择
  8. c语言作业模块化设计具体,C语言程序模块化设计.doc
  9. c盘满了一键检测,清理,瘦身!
  10. 宏晶STC单片机使用STC-ISP串口烧录失败的解决方法及实例汇总 (Ver0.99.15)
  11. 接口收到CRC错包怎么处理
  12. win10计算机屏幕暗怎么办,Win10电脑屏幕亮度调不了怎么办
  13. 纯CSS实现的3D翻页效果
  14. 【Vue3】vue3中组合式Api的setup写法快速入门上手起步
  15. GIF录制编辑工具(GifCam)
  16. WordPress站点快速集成腾讯数字身份管控平台CIAM,免开发实现登录认证
  17. 【前端】【html5/css3】前端学习之路(二)(CSS3新选择器/CSS3盒模型/CSS3过渡效果)
  18. grabcut 实现过程
  19. 查询计算机系统操作工,计算机系统操作工B卷
  20. 电脑 | 更新后显示器无法实现夜间模式

热门文章

  1. django连接mysql步骤_使用Django连接Mysql数据库步骤
  2. python网管系统_IT外包网管服务,Python密度聚类算法-DBSCAN实践
  3. LeetCode题集大全
  4. 【WebRTC---进阶篇】(二)libevent实现高性能网络服务器
  5. android4.0支持m3u8格式,【报Bug】安卓下无法播放M3U8格式音频,报错
  6. python webbrowser点击_用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!...
  7. linux vim自动换行,VIM 的自动换行及自动折行设置
  8. 如何用python实现地图定位_基于 PyQt5 实现地图中定位相片拍摄位置
  9. spyder pyecharts不显示_165Hz+1ms仅需千元左右 优派VX2771HDPRO显示器
  10. androidstudio --debug 出现 source code not match bytecode