在SpringBoot中,事务回滚可以用注解@Transactional标识。

Spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。

1、非检查型异常一般继承自Error或者RuntimeException

2、检查型异常一般指继承自Exception的异常

在实际使用过程中,可以自由指定那种异常需要进行事务回滚,一般为以下几种:

1、 让checked例外也回滚: @Transactional(rollbackFor=Exception.class)

2、 让unchecked例外不回滚: @Transactional(noRollbackFor=RunTimeException.class)

3 、不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED),或者不添加

注意: 如果你的异常被手动try{}catch{}了,事务则不会回滚,系统会认为你已经手动进行了异常处理,如果想让事务回滚必须往外抛throw Exception

在实际使用过程中,有的事务回滚没有生效,这时候需要知道Spring中一个关于事务使用的规则。在同一个类中,一个没有带事务的方法中调用一个带事务的方法时,这个事务回滚不会生效。如下代码所示。

public class M {
public void a(D d) {
try {
System.out.println(d.getA());
b(d);
System.out.println("a--" + d.getA());
}catch (Exception e){
System.out.println("a--" + d.getA());
} } @Transactional(rollbackFor = Exception.class)
public void b(D d) {
System.out.println(d.getA());
d.setA(10);
int c = 2;
c = c / 0;
}
}

在上述代码中,a()方法不带事务且调用一个带事务的方法,结果在b()方法执行时,c = c / 0会抛出出书不能为零的异常,正常情况下事务会回滚,也就是实例d中a的值应该回滚到设置为10之前。但是结果表明没有,也就是事务回滚没有生效。

解决办法

1、将无事务方法和有事务方法不要放在同一个类中。

在动态代理机制中,一次操作,proxy不会重复代理一个对象两次,基于代理的method.invoke...方法,无事务方法调用有事务方法时,即使加了事务注解@Transaction也不会生效。

2、获取被代理对象的proxy,让代理对象调用事务方法。

首先在项目启动类上添加动态代理事务注解 @EnableAspectJAutoProxy(exposeProxy = true)

在调用事务方法时,使用AopContext.currentProxy()获取被代理对象的proxy,让后用proxy调用事务方法。代码如下:

(M)AopContext.currentProxy().b(d);

关于SpringBoot中事务回滚没有生效的更多相关文章

  1. springboot手动事务回滚

    亲测在使用@Transactional.@Transactional(rollbackFor = Exception.class)及catch异常之后 throw new RuntimeExcepti ...

  2. springboot 开启事务回滚

    在数据库操作时如果发生异常,回滚的方法 在方法上添加注解@Transactional,作用域是方法级的 参考资料: https://www.cnblogs.com/c2g5201314/p/13163 ...

  3. SQL 存储过程中事务回滚

    在事务语句最前面加上 set xact_abort on GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[test] @a int, @b ...

  4. Spring中的事务回滚机制

    初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Trans ...

  5. springboot 事务回滚

    在springboot中,使用事务回滚时,添加@Transactional注解,然后在try-catch块中,发生异常时,在catch中 添加 TransactionAspectSupport.cur ...

  6. 浅谈Spring中的事务回滚

        使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...

  7. Spring中@Transactional事务回滚

    转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部 ...

  8. Myql 中的事务回滚机制概述 ?

    事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销. 要同时修改数据库中两个不同表时,如果它们不是一个事 ...

  9. Myql 中的事务回滚机制概述 ?

    事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销.要同时修改数据库中两个不同表时,如果它们不是一个事务 ...

  10. [转] C# mysql 事务回滚

    什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...

随机推荐

  1. 基于docker的cicd

    基于docker的cicd 飞书链接: https://dlk2qiw7lh.feishu.cn/docs/doccnyu14HTaamVzASIXreCSNjf 相关软件 链接:https://pa ...

  2. minos 1.1 内存虚拟化——hyp

    首发公号:Rand_cs minos 1.1 内存虚拟化--hyp 内存虚拟化,目前理解主要两方面: 内存管理,没有虚拟化的情况时,对于 Linux 内核运行在物理硬件之上,内核需要管理物理内存,需要 ...

  3. LeetCode 715. Range Module Range 模块 (Java)

    题目: A Range Module is a module that tracks ranges of numbers. Your task is to design and implement t ...

  4. linux系统下,配置多个tomcat服务

    安装jdk时配置的环境变量 export JAVA_HOME=/usr/local/jdk1.8.0_311 export JRE_HOME=$JAVA_HOME/jre export PATH=$P ...

  5. EF MYSQL DB FIRST 出现2次数据库名

    环境:使用ADO设计器添加的数据库实体,运行时出现 :Table 'world.world.city' doesn't exist . world 是mysql的演示数据库. MySql.Data.E ...

  6. Javascript高级程序设计第三章 | ch3 | 阅读笔记

    语言基础 语法 标识符 注释 // /* */ 严格模式 // 也可以单独指定在一个函数中进行 'use strict' 语句 语句末尾分号不是必须的,但是最好加上 加上分号方便开发者删除空行压缩代码 ...

  7. 牛客网在线编程-语法篇-基础语法——C 语言解题集

    前言 牛客网在线编程-语法篇-基础语法--C 语言解题集. 点击下方超链接跳转至对应编程题目,文章包含解析及源码. 01-基础语法 简单输出 BC1-Hello Nowcoder BC2-小飞机 基本 ...

  8. 数据库学习(一)——DDL数据库定义语句

    定义数据库 创建数据库 使用CRETE DATABASE关键字,指定编码和排序格式 CREATE DATABASE mysqldb DEFAULT CHARACTER SET utf-8 DEFAUL ...

  9. 天翼云centos7.6安装redis6.2.6

    以下部分的具体略: 1.wget获取源码 2.make 这里重点说下,如何使用 utils/install_server.sh脚本 使用install_service.sh添加服务 有了这个脚本,那么 ...

  10. LeetCode11. 盛最多水的容器题解

    LeetCode11. 盛最多水的容器题解 题目链接: https://leetcode.cn/problems/container-with-most-water 示例 思路 暴力解法 定住一个柱子 ...