当前位置: 首页 > news >正文

记录spring中Transactional事务注解失效的六个场景

记录spring中Transactional事务注解失效的六个场景

方法内的自调用

原因:通过this内部调用其他带有@Transactional注解的方法,是通过this进行调用,并没有通过cglib代理对象进行调用,导致方法未被增强导致无法检测内部事务
解决方法:通过实现类内部自己注入自己的bean实现调用内部方法,以调用cglib增强的代理方法。或者通过AopContext.currentProxy()获取当前代理对象,使用之前需要引aspectjweaver依赖,并且需要在启动类上加入@EnableAspectJAutoProxy(exposeProxy=true)注解。或者在调用方加入@Transactional注解

方法是private的

原因:spring基于cglib进行AOP,cglib基于父子类来实现的,子类是代理类,父类是被代理类,如果父类某个方法是被private修饰,子类的类没法拿到父类的方法,所以导致方法无法被cglib代理,进而无法使用代理方法
解决方法:使用public

方法是final的

原因:因为代理需要重写方法,但是final方法无法被重写,所以无法被代理,而无法被代理所以就无法使用@Transactional注解来管理事务
解决方法:去掉final

单独的线程调用方法

原因:事务是跟连接绑定的,而一个连接是一个线程,新开了一个线程等于新开了一个事务,两个线程的事务管理不同

异常被吃掉

原因:事务回滚是根据异常进行的,手动进行异常处理不会回滚事务

类没被spring管理

原因:没进行bean注入,直接new无法使用spring的事务管理

管理事务的方式

1.使用编程式事务,beginTransaction(), commit(), rollback()
2.基于TransactionProxyFactoryBean的声明式事务管理
3.基于@Transactional的声明式事务管理
4.基于Aspectj AOP配置事务
5.使用分布式事务进行管理,2PC,3PC、TCC

如何避免事务失效

1.使用编程式事务,手动提交
2.避免慢查询
3.不要再事务中加入耗时操作,如rpc,大批量插入修改等

http://www.lryc.cn/news/10527.html

相关文章:

  • 【23种设计模式】行为型模式详细介绍(下)
  • dbeaver工具连接达梦数据库
  • 比Teambition、Worktile 更适合研发团队的几大工具盘点
  • matlab图像处理常用功能以及函数
  • eBPF 之 ProgramType、AttachType和InputContext
  • C++运行时类型识别RTTI
  • idea多时编辑多行-winmac都支持
  • BI是报表?BI是可视化?BI到底是什么?
  • Python基础-数据类型之元组
  • 大数据面试小抄
  • Vue:(三十一)Vue封装的过度与动画
  • 文本处理:字符串替换
  • python 调用 dll 出现精度问题
  • STL讲解——模拟实现string
  • CDH 6.3.2 升级Hive 2.3.9
  • 距离不是拦截我们前进的主因,与社科院杜兰金融硕士一起奔赴山海
  • 【SpringBoot】MyBatis-plus 报错 sqlSessionFactory sqlSessionTemplate 最新解决办法
  • jsp诊疗预约系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 详解 APISIX Lua 动态调试插件 inspect
  • #科研筑基# python初学自用笔记 第五篇 函数
  • 设计模式之策略模式
  • dbdeployer 使用札记
  • MATLAB算法实战应用案例精讲-【图像处理】数字图像模糊化(附Java、python和matlab代码实现)
  • 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法
  • 【C++修行之路】C/C++内存管理
  • spring cloud alibaba Sentinel(四)
  • Redis第三讲
  • JAVA线程池的使用
  • 力扣56.合并区间
  • 代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||