首页 > 其他分享 >sping 事务失效的7中情况

sping 事务失效的7中情况

时间:2024-03-25 23:22:06浏览次数:22  
标签:事务 sping 回滚 切面 失效 方法 解法

1、抛出检查异常导致事务不能正确回滚

原因:Spring 默认只会回滚非检查异常

解决:配置 rollbackFor 属性

@Transactional(rollbackFor = Exception.class)

2、业务方法内自己 try-catch 异常导致事务不能正确回滚

原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉

 

解法1:异常原样抛出

 

 

在 catch 块添加 throw new RuntimeException(e);

 

 

解法2:手动设置 TransactionStatus.setRollbackOnly()在 catch 块添加

 

TransactionInterceptor.currentTransactionStatus().setRollbackOnly(); 3、 aop 切面顺序导致导致事务不能正确回滚

原因:事务切面优先级最低,但如果自定义的切面优先级和他一样,则还是自定义切面在内层,这时若自定义切面没有正确抛出异常…

解法1、2:同情况2 中的解法:1、2

解法3:调整切面顺序,在 自定义切面上添加 @Order(Ordered.LOWEST_PRECEDENCE - 1) (不推荐)

4、非 public 方法导致的事务失效

原因:Spring 为方法创建代理、添加事务通知、前提条件都是该方法是 public 的

解法1:改为 public 方法

解法2:添加 bean 配置如下(不推荐)

  • @Bean
    public TransactionAttributeSource transactionAttributeSource() {
    return new AnnotationTransactionAttributeSource(false);
    }

5、父子容器导致的事务失效

原因:子容器扫描范围过大,把未加事务配置的 service 扫描进来

解法1:各扫描各的,不要图简便

解法2:不要用父子容器,所有 bean 放在同一容器

6、调用本类方法导致传播行为失效

原因:本类方法调用不经过代理,因此无法增强

解法1:依赖注入自己(代理)来调用,需要在配置类上添加@EnableAspectJAutoProxy(exposeProxy = true)

解法2:通过 AopContext 拿到代理对象,来调用

解法3:通过 CTW,LTW 实现功能增强

7、@Transactional 没有保证原子行为

原因:事务的原子性仅涵盖 insert、update、delete、select … for update 语句,select 方法并不阻塞

8、@Transactional 方法导致的 synchronized 失效

synchronized 保证的仅是目标方法的原子性,环绕目标方法的还有 commit 等操作,它们并未处于 sync 块内

事务在锁外层,多线程可能出现先释放锁,后提交事务的情况。debug测试,可启多个线程,断点DataSourceTransactionManager类doCommit方法

@Transactional(rollbackFor = Exception.class)
public synchronized void test() {
// todo
}

 

解法1:synchronized 范围应扩大至代理方法调用

解法2:使用 select … for update 替换 select

标签:事务,sping,回滚,切面,失效,方法,解法
From: https://www.cnblogs.com/szc1998/p/18095636

相关文章

  • MYSQL多表设计,多表查询,事务,索引
    目录一多表设计1.1一对多1.1.1 外键约束1.2一对一1.3多对多二多表查询2.1数据准备:2.2笛卡儿积:2.3分类2.3.1内连接2.3.2外连接 三子查询 3.1标量子查询3.2列子查询3.3行子查询3.4表子查询四事务4.1场景4.2语法 4.3事务特性 五索引5.1索引概述 5......
  • 基于Spring Boot+Vue的高校办公室行政事务管理系统
    末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发更多项目:CSDN主页YAML墨韵学如逆水行舟,不进则退。学习如赶路,不能慢一步。目录一、项目简介二、开发技术与环境配置2.1SpringBoot框架2.2Java语言简介2.3Vue的介绍2.4mysql数据库介绍2.5B/S......
  • 二、SQL基础学习(函数、约束、事务)
    目录1、函数1.1、字符串函数1.2、数值函数1.3、日期函数1.4、流程函数2、约束2.1、外键约束2.2、删除/更新行为3、事务3.1、事务的四大特性3.2、并发事务问题3.2、事务的隔离级别1、函数1.1、字符串函数#concatselectconcat('Hello','MySql');#lowers......
  • @Transactional注解失效场景以及解决方法
    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点面试官:说一说@Transactional注解失效的场景以及解决方法@Transactional是Spring框架提供的一个注解,用于声明事务的边界。它可以应用于类、方法或接口上,用于指定......
  • go-zero处理本地事务
    go-zero处理本地事务,sqlx.SqlConn提供了基础的事务机制,官方代码varconnsqlx.SqlConnerr:=conn.TransactCtx(context.Background(),func(ctxcontext.Context,sessionsqlx.Session)error{r,err:=session.ExecCtx(ctx,"insertintouser(......
  • 大数据分布式事务的深入理解?
        在一个大数据系统内部分布式事务无处不在,但凡一个任务分布到多台机器上执行就会涉及到分布式事务的场景,分布式事务一直以来都是分布式系统比较难以解决的问题。    事务的理解,比如你要将账户A转1块钱到账户B中,那么这个行为在执行时会被拆分成两个步骤,第一......
  • mongoDB使用记录:副本集选举淘汰策略失效
    一个问题场景:业务请求查询数据库,当请求没有成功返回时(这里是数据库机器异常,表现是不返回请求结果,处于假死状态),业务挂起进入等待(WAIT),逻辑中断,表现为卡顿、持续加载中;高并发场景下,短时间内堆积的请求会大量占用发起数据库请求的机器的内存(风险一),大量业务卡顿异常;当数据库异常解决成......
  • 09 事务和连接池
    文章目录properties文件连接池service层实现类dao层实现类dao层实现类连接池类:创建线程池静态常量,用于放连接。创建Properties静态常量,用于解析properties文件静态代码块中,解析properties文件,将解析结果用于创建连接池连接方法:用线程获取连接,若没有,从连接池......
  • 关于并发编程一些问题与解决--事务回滚@Transactional
    先贴一下代码吧@Transactional@OverridepublicintupSunp(Integera_id){//查询数据库QueryWrapper<Animal>animalQueryWrapper=newQueryWrapper<>();animalQueryWrapper.eq("a_id",a_id);Animalanima......
  • uniapp开发ios,scroll-view横向滚动失效,动态获取scroll-view内部子容器总宽度,然后添加
    这是老bug了,官方一直没有解决掉。已经摸索到完美解决方案,遇到这个问题的可以看下。本文以三级导航页面中的二级横向滚动导航为例,说明如何做到不同宽度子元素的横向滚动。bug定位:本来横向滚动只要子元素宽度大于scroll-view固定宽度就可以滚动的,但是IOSApp开发中子元素高度必须......