您现在的位置是:亿华云 > IT科技类资讯
Spring事务失效场景汇总
亿华云2025-10-09 03:44:27【IT科技类资讯】5人已围观
简介项目中用Spring的 @Transactional 注解控制事务,使用中时常出现事物不生效的场景,本文仅限于日常项目开发中的点滴整理总结,总结以下几点,以备后续参考排查;可能不
项目中用Spring的事务失效 @Transactional 注解控制事务,使用中时常出现事物不生效的场景场景,本文仅限于日常项目开发中的汇总点滴整理总结,总结以下几点,事务失效以备后续参考排查;可能不全,场景列举出来希望可以帮助有需要的汇总同学,避免踩坑。事务失效数据库引擎不支持事物
这里以 MySQL 为例,场景其 MyISAM 引擎是汇总不支持事务操作的,InnoDB 才是事务失效支持事务的引擎,一般要支持事务都会使用 InnoDB。场景
根据 MySQL 的汇总官方文档:
https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html
从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的事务失效都是:MyISAM,所以这点要值得注意,场景底层引擎不支持事务是汇总硬伤。
没有被 Spring 管理// @Service (此注解不能去掉)
public class AccountServiceImpl implements AccountService {
@Transactional
public void inser(Account account) {
// insert account
}
}如果此时把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。
方法不是网站模板 public 的以下来自于Spring 官方文档:
When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.意思就是 @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以考虑开启 AspectJ 代理模式。
自身调用问题看下面代码
@Service
public class AccountServiceImpl implements AccountService {
public void insert(Account account) {
insertAccount(account);
}
@Transactional
public void insertAccount(Account account) {
// insert account
}
}insert方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 insertAccount 方法,insertAccount 方法上的事务其实是不管用的。
再看下面的代码
@Service
public class AccountServiceImpl implements AccountService {
@Transactional
public void insert(Account account) {
insertAccount(account);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertAccount(Account account) {
// insert account
}
}这次在 insert 方法上加了 @Transactional,insertAccount 加了 REQUIRES_NEW 新开启一个事务,那么新开的事务管用么?
这两个例子的答案是:不管用!
因为它们发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效,这也是老生常谈的经典问题了。
数据源没有配置事物管理器@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource)
{
return new DataSourceTransactionManager(dataSource);
}如上面所示,当前数据源若没有配置事务管理器,照样会失效!
不支持事物@Service
public class AccountServiceImpl implements AccountService {
@Transactional
public void insert(Account account) {
insertAccount(account);
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void insertAccount(Account account) {
// insert account
}
}Propagation.NOT_SUPPORTED: 表示不以事务运行,当前若存在事务则挂起,b2b信息网详细的可以参考InnoDB的事务隔离级别和传播机制。
都主动不支持以事务方式运行了,那事务生效也是白搭!
异常被吃掉这个是比较常见的场景
@Service (此注解不能去掉)
public class AccountServiceImpl implements AccountService {
@Transactional
public void inser(Account account) {
try {
// insert account
} catch {
}
}
}把异常吃了,然后又不抛出来,事务就无法回滚!
异常类型错误@Service (此注解不能去掉)
public class AccountServiceImpl implements AccountService {
@Transactional
public void inser(Account account) {
try {
// insert account
} catch {
throw new Exception("新增错误");
}
}
}这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)这个配置仅限于 Throwable 异常类及其子类。
查阅资料,其他失效的场景需注意:1) 像文件导入数据库,用多线程控制;可参考查询spring 多线程事务的问题 2)SpringBoot+Shiro引起事务失效
总结本文总结了几种事务失效的场景,其实发生最多就是自身调用、异常被吃、异常抛出类型不对这三个了;像文章开头说的那样,本文不一定总结得全,只是根据经验总结常见的服务器租用事务失效的场景,如有遗漏,欢迎大佬们留言分享。
很赞哦!(5847)
上一篇: 四、长串数字域名
下一篇: 4、选择一个安全的域名注册商进行域名注册
相关文章
- 2. 不要花大价钱买域名,新手鉴别能力不足,容易投资失误。
- 简单代码的秘诀—去掉显而易见的,加上有意义的
- 编程中花括号的简史
- JVM(Java Virtual Machine)源码分析-类加载场景实例分析
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 深入Python中的itertools模块
- TCP接入层的负载均衡、高可用、扩展性架构
- 推荐神器!10个Star上万的Vue开源项目
- 为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
- 这个调查显示 Go 竟然是 2020 年很受欢迎的编程语言
站长推荐
a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
面试官:String长度有限制吗?是多少?还好我看过
什么是CaaS?简化容器管理
在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)
4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
用于构建API和微服务的流行JavaScript框架
在Ant Design 4.0里,我们如何追求快乐的工作?
21个Node.js面试问题与解决方案