spring中事务失效的几种情况
下面简单介绍下,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中事务失效的几种情况相关推荐
- spring中事务配置的3种方式-2
http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch09s05.html http://zpchen.iteye.com/blog/ ...
- spring中事务配置的3种方式
http://xuxiaolei.iteye.com/blog/417803 (1)通过TransactionProxyFactoryBean来声明 Xml代码 <?xml version= ...
- Spring 事务失效的 8 种场景!
在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题.而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题. 点击上方卡片关注我 今天, ...
- Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现
前言 本专题大纲如下: 事务专题大纲 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用中的问题,这两天想了想还是单独写一篇并作为事 ...
- Spring中事务的使用、抽象机制及模拟Spring事务实现
本文大纲如下: Spring事务应用大纲 编程式事务 Spring提供了两种编程式事务管理的方法 使用 TransactionTemplate 或者 TransactionalOperator. 直接 ...
- 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...
Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用 ...
- C++迭代器失效的几种情况总结
一.序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque ...
- Spring 中获取 request 的几种方法,及其线程安全性分析
概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等 ...
- mysql数据索引失效_MySQL索引失效的几种情况
1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...
最新文章
- Jenkins 安装简记录
- CYJian的新春虐题赛
- 知识库如何跟其他业务系统结合
- 文本文件与0、1文件
- Django Rest Framework源码剖析(七)-----分页
- java中elapseTime设置新时间,Java ApplicationLike.getApplicationStartElapsedTime方法代码示例...
- 优麒麟Ubuntu20.04安装各种问题
- vue中对话框关闭以后清空对话框中input,select内容
- 加密狗破解教程-数据抓取工具
- wps居中对齐不在中间_如何解决wps表格居中调整
- ls 命令显示的total是什么意思
- 周鸿祎反流氓的基本商业逻辑(ZZ)
- 00001-微信小游戏--显示图片
- charles+Proxifier实现抓包pc端(exe程序)
- 桌面图标带有蓝色问号解决办法
- Matlab实现图像识别(五)
- Python使用HMACSHA1加密生成签名
- 【实验报告】实验一 简单类的设计与应用
- 这是 Pandas 最详细教程了
- 如何利用Python自动根据数据生成降雨量统计分析报告
热门文章
- mysql初始化主机名无法解析
- 《java并发编程实践》笔记
- SAP HANA如何在存储过程中使用自定义的table type
- GraphQL —— 标量类型
- “产学合作勇创新·协同育人书新篇”贵州理工大数据学院数据科学训练营结题答辩报告会圆满举行...
- selenium - webdriver - 定位一组元素
- SparkSql之DataFrame操作
- call to member function bind_param() on boolean...........
- 【解除Windows开机登陆密码的5种方法】
- Android@Home与智能家居