以下场景是基于mysql数据库,InnoDB的存储引擎。

一.没有添加@Transactional注解

二.方法声明是private或者static

三.没有抛出异常而是try catch了异常

下面这种情况,事务不会回滚

@Transactional
public void insertUser(String name){
try {
User user = new User();
user.setName(name);
userDao.insertUser(user);
//模拟抛异常
throw new RuntimeException();
} catch (RuntimeException e) {
e.printStackTrace();
}
}

四.异常类型不对

默认只对runtimeException的类型进行回滚,如果抛出Exception异常是不进行回滚的,如果想回滚要配置@Transactional(rollbackFor = Exception.class)

@Transactional
public void insertUser(String name) throws Exception { User user = new User();
user.setName(name);
userDao.insertUser(user);
//模拟抛异常
throw new Exception();
}

五.自己调自己

下面这种情况,事务是不生效的,如果要生效,可以把this调用放到另外一个类,insertStu这个放另外一个类,这样可以这个方法有事务

public void insertUser(String name) {
User user = new User();
user.setName(name);
//没有事务,不会回滚,保存成功
userDao.insertUser(user);
insertStu(name);
} @Transactional
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
//没有事务,保存会成功
stuDao.insertUser(stu);
throw new RuntimeException();
}

下面这种情况,事务是生效的,注意

@Transactional
public void insertUser(String name) {
User user = new User();
user.setName(name);
//有事务,会回滚,保存不成功
userDao.insertUser(user);
insertStu(name);
} public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
//有事务,会回滚,保存不成功
stuDao.insertUser(stu);
throw new RuntimeException();
}

六.没有配置正确的事务管理器

如果项目中是多数据源情况,要单独配置事务管理器。当引入jdbc依赖之后,Spring Boot会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,

所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。

spring 事务失效的几种场景的更多相关文章

  1. 聊聊spring事务失效的12种场景,太坑了

    前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要么同时成功,要么同时失败),避免数据 ...

  2. spring事务失效的12种场景

    一 事务不生效 1.访问权限问题 java的访问权限主要有四种:private<default<protected<public. 把有某些事务方法,定义了错误的访问权限,就会导致事 ...

  3. Spring事务失效的2种情况

    使用默认的事务处理方式 因为在java的设计中,它认为不继承RuntimeException的异常是”checkException”或普通异常,如IOException,这些异常在java语法中是要求 ...

  4. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  5. Spring事务管理的四种方式(以银行转账为例)

    Spring事务管理的四种方式(以银行转账为例) 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败.   原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不 ...

  6. Spring事务失效的原因

    http://blog.csdn.net/paincupid/article/details/51822599 Spring事务失效的原因 5种大的原因 如使用mysql且引擎是MyISAM,则事务会 ...

  7. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  8. Spring事务配置的五种方式(转发)

    Spring事务配置的五种方式(原博客地址是http://www.blogjava.net/robbie/archive/2009/04/05/264003.html)挺好的,收藏转发 前段时间对Sp ...

  9. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

随机推荐

  1. LuoguB2147 求 f(x,n) 题解

    Content 求给定 \(x,n\),求 \(f(x,n)=\sqrt{n+\sqrt{(n-1)+\sqrt{(n-2)+\sqrt{\dots+2+\sqrt{1+x}}}}}\) 的值. So ...

  2. MLNX网卡驱动安装

    安装/升级MLNX驱动 1. 安装准备 驱动下载地址:https://www.mellanox.com/products/ethernet-drivers/linux/mlnx_en 选择和系统版本匹 ...

  3. webservice注意事项

    1.private static final QName PORT_NAME = new QName("http://server.helloworld.cxf.demo/",&q ...

  4. Pointcut 表达式

    AOP 概念篇 今天介绍 Pointcut 的表达式 通配符 常见的通配符如下 .. 含义一:方法表达式中.代表任意数量的参数 @Service public class HelloService { ...

  5. 【LeetCode】482. License Key Formatting 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. 【剑指Offer】和为S的两个数字 解题报告(Python)

    [剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  7. Anniversary party(hdu1520)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. codeforces626D . Jerry's Protest

    Andrew and Jerry are playing a game with Harry as the scorekeeper. The game consists of three rounds ...

  9. 浏览器Cookie无法删除问题

    1.写Cookie时添加路径: //写cookies,设置过期时间为30天,并设置path为根目录 function setPathCookie(name,value) { var Days = 30 ...

  10. 使用 DDL 语句分别创建仓库表、供应商表、产品表和入库表,并对其进行操作

    查看本章节 查看作业目录 需求说明: 使用 DDL 语句分别创建仓库表.供应商表.产品表和入库表 使用 DML 语句分别新增一条仓库表.供应商表.产品表和入库表记录 使用 DML 语句更新满足指定条件 ...