下面简单介绍下,spring中常见的事务失效的几种情况。让我们在开发的过程避免这些情况,写出正确而且优雅的代码。

文章目录

  • 数据库引擎不支持,mysql需要InnoDB
  • 方法必须是public的
  • 方法必须是被其他类调用
  • 业务方法中异常被try-catch掉,导致异常没有抛出,没有触发回滚,事务失效
  • 打上事务注解的方法所在的类并没有交给spring的IOC容器管理,同样会导致事务失效
  • @Transitional默认是捕获运行时异常(继承RuntimeException)才回滚,所以如果想要捕获所有异常都回滚,需要在@Transitional后面加上(rollbackFor=Exception.class)
  • 本文小结

数据库引擎不支持,mysql需要InnoDB

MySQL的MyISAM引擎是不支持事务操作的,InnoDB引擎才支持事务。


方法必须是public的

@Transactional(rollbackFor = Exception.class)protected  int batchAdd(List<Role> roleList) {int i = roleMapper.insertList(roleList);Integer a = null;a.toString();return  i;}

方法必须是被其他类调用

自身调用问题,业务层自身非事务方法调用事务方法,会导致不经过Spring的代理类。默认只有在外部调用事务方法,事务才会生效。

@Service
public class RoleServiceImpl implements RoleService {@Transactional(rollbackFor = Exception.class)public int batchAdd(List<Role> roleList) {int i = roleMapper.insertList(roleList);Integer a = null;a.toString();return  i;}public int testBatchAdd(List<Role> roleList){return  batchAdd(roleList);}
}class Test{@AutowiredRoleServiceImpl service;@Testpublic void test() {Role role = new Role();role.setRoleName("sss");role.setRemark("哈哈哈");Role role2 = new Role();role.setRoleName("bbb");role.setRemark("嘿嘿嘿");List<Role> roleList = new ArrayList<>();roleList.add(role);roleList.add(role2);int i = service.testBatchAdd(roleList);}
}

业务方法中异常被try-catch掉,导致异常没有抛出,没有触发回滚,事务失效

需要抛出异常,才会回滚,如果你已经自己把异常捕获了,但是没有继续往外抛,那么也是不会回滚的。

    @Transactional(rollbackFor = Exception.class)@Overridepublic int batchAdd(List<Role> roleList) {int i = roleMapper.insertList(roleList);try {Integer a = null;a.toString();}catch (Exception e){//todo something}return  i;}

打上事务注解的方法所在的类并没有交给spring的IOC容器管理,同样会导致事务失效

// @Service 注释掉@Service注解,此类就没有交给Spring管理
public class RoleServiceImpl implements RoleService {@Transactional(rollbackFor = Exception.class)public int batchAdd(List<Role> roleList) {int i = roleMapper.insertList(roleList);Integer a = null;a.toString();return  i;}}

@Transitional默认是捕获运行时异常(继承RuntimeException)才回滚,所以如果想要捕获所有异常都回滚,需要在@Transitional后面加上(rollbackFor=Exception.class)

业务方法中的运行时异常被try-catch之后,在catch里面抛出的异常类型不是运行时异常,同样会导致事务失败,因为如果不在事务注解中声明触发回滚类型,默认的是RuntimeException。

    @Transactional@Overridepublic int batchAdd(List<Role> roleList) throws MyException {int i = 0;try {i = roleMapper.insertList(roleList);Integer a = null;a.toString();}catch (Exception e){throw new MyException("xxx错误");}return  i;}

本文小结

本文简单介绍了spring中事务失效的常见几种情况。

spring中事务失效的几种情况相关推荐

  1. spring中事务配置的3种方式-2

    http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch09s05.html http://zpchen.iteye.com/blog/ ...

  2. spring中事务配置的3种方式

    http://xuxiaolei.iteye.com/blog/417803 (1)通过TransactionProxyFactoryBean来声明 Xml代码   <?xml version= ...

  3. Spring 事务失效的 8 种场景!

    在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题.而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题. 点击上方卡片关注我 今天, ...

  4. Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现

    前言 本专题大纲如下: 事务专题大纲 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用中的问题,这两天想了想还是单独写一篇并作为事 ...

  5. Spring中事务的使用、抽象机制及模拟Spring事务实现

    本文大纲如下: Spring事务应用大纲 编程式事务 Spring提供了两种编程式事务管理的方法 使用 TransactionTemplate 或者 TransactionalOperator. 直接 ...

  6. 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...

    Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用 ...

  7. C++迭代器失效的几种情况总结

    一.序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque ...

  8. Spring 中获取 request 的几种方法,及其线程安全性分析

    概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等 ...

  9. mysql数据索引失效_MySQL索引失效的几种情况

    1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...

最新文章

  1. Jenkins 安装简记录
  2. CYJian的新春虐题赛
  3. 知识库如何跟其他业务系统结合
  4. 文本文件与0、1文件
  5. Django Rest Framework源码剖析(七)-----分页
  6. java中elapseTime设置新时间,Java ApplicationLike.getApplicationStartElapsedTime方法代码示例...
  7. 优麒麟Ubuntu20.04安装各种问题
  8. vue中对话框关闭以后清空对话框中input,select内容
  9. 加密狗破解教程-数据抓取工具
  10. wps居中对齐不在中间_如何解决wps表格居中调整
  11. ls 命令显示的total是什么意思
  12. 周鸿祎反流氓的基本商业逻辑(ZZ)
  13. 00001-微信小游戏--显示图片
  14. charles+Proxifier实现抓包pc端(exe程序)
  15. 桌面图标带有蓝色问号解决办法
  16. Matlab实现图像识别(五)
  17. Python使用HMACSHA1加密生成签名
  18. 【实验报告】实验一 简单类的设计与应用
  19. 这是 Pandas 最详细教程了
  20. 如何利用Python自动根据数据生成降雨量统计分析报告

热门文章

  1. mysql初始化主机名无法解析
  2. 《java并发编程实践》笔记
  3. SAP HANA如何在存储过程中使用自定义的table type
  4. GraphQL —— 标量类型
  5. “产学合作勇创新·协同育人书新篇”贵州理工大数据学院数据科学训练营结题答辩报告会圆满举行...
  6. selenium - webdriver - 定位一组元素
  7. SparkSql之DataFrame操作
  8. call to member function bind_param() on boolean...........
  9. 【解除Windows开机登陆密码的5种方法】
  10. Android@Home与智能家居