Spring事物失效的八大场景

这篇具有很好参考价值的文章主要介绍了Spring事物失效的八大场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.方法内的自调用:spring事物是基于aop的,只要使用代理对象调用某个方法时,spring事物才能生效,而在一个方法内使用this.xxx()时。this并不是代理对象,所以会失效(实际上是@transaction注解失效)

解决办法:1.自己注入自己

                        2.把调用方法拆分到另一个bean中

                        3.AopContext.currentProxy()+@EnableAspectJAutoProxy(exposeProxy=true)

Spring事物失效的八大场景

 

2.方法是private的 Spring事物是基于CGLIB进行aop,而CGLIB会基于父子类,子类是代理类,父类是被代理类,如果父类中的某个方法是private的。那么子类就没有办法重写它,也就没有办法额外增加Spring事物的逻辑

3。方法是final 的,原因和private一样,子类不能重写父类的fianl的方法

4.单独的线程方法调用:当mybatis或者jdbcTemplate执行sql时,会从ThreadLocal中获取数据库连接对象,如果开启事物的线程和执行sql的线程是同一个,那么就能拿到数据库连接对象,如果不是同一个线程,那么就拿不到,这样mybatis或者jdbcTemplate就会新建一个数据库连接执行sql

此时数据库的自动提交为true,那么sql执行完就会提交,后续有异常也不能回滚已经执行的额sql

5.没加@Configruration 注解,如果是springboot,没这个问题,如果是之前的spring,可能会有这个问题,这是因为mybatis或者jdbcTemplate执行sql时,会从ThreadLocal中获取数据库链接,但是threadlocal中存储的是map,map的key是datasource对象,value是连接对象,如果我们每日天假注解的话,会导致map中存储的datasource对象和mybatis和jdbctemplate对象不想等,从而拿不到数据库连接,导致自己去创建连接

6,异常被吃掉,如果spring没有捕获到一场,那么就不会回滚了,spring默认会补货runtimeException和Error

7.类没有被spring管理

8,数据库不支持事务文章来源地址https://www.toymoban.com/news/detail-481397.html

到了这里,关于Spring事物失效的八大场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring高手之路-Spring事务失效的场景详解

    目录 前言 @Transactional 应用在非 public 修饰的方法上 同一个类中方法调用,导致@Transactional失效 final、static方法 @Transactional的用法不对 @Transactional 注解属性 propagation 设置不当 @Transactional注解属性 rollbackFor 设置错误 用错注解 异常被捕获 数据库引擎不支持事务 Spring中比较容易

    2024年01月18日
    浏览(31)
  • Spring高手之路-Spring的AOP失效场景详解

    目录 前言 1.非Spring管理的对象 2.同一个Bean内部方法调用 3.静态方法 4.final方法 5.异步方法 总结 Spring的AOP(面向切面编程)是一种强大的技术,用于在应用程序中实现横切关注点的模块化。虽然Spring的AOP在大多数情况下都是有效的,但在某些场景下可能会失效。下面来分析

    2024年01月21日
    浏览(33)
  • Spring 事务失效的八种场景

    原因:Spring 默认只会回滚非检查异常 解法:配置 rollbackFor 属性 @Transactional(rollbackFor = Exception.class) 原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉 解法1:异常原样抛出: 在 catch 块添加 throw new RuntimeExc

    2024年02月14日
    浏览(30)
  • 揭秘Spring事务失效场景分析与解决方案

    在Spring框架中,事务管理是一个核心功能,然而有时候会遇到事务失效的情况,这可能导致数据一致性问题。本文将深入探讨一些Spring事务失效的常见场景,并提供详细的例子以及解决方案。 场景: 当一个事务方法内部调用另一个方法,而被调用的方法没有声明为 @Transact

    2024年02月02日
    浏览(34)
  • Spring事务传播机制、实现方式、失效场景即原理

    贴一篇源码分析的好文章:https://blog.csdn.net/qq_30905661/article/details/114400417 一个事务对应一个数据库连接。 通过 this 来调用某个带有 @Transactional 注解的方法时,这个注解是失效的 spring事务底层是通过数据库事务和AOP实现的 首先对于使用@Transactional的注解的bean,spring会创建一个

    2024年02月14日
    浏览(25)
  • Spring中事务失效的8中场景 对于一个事务开子线程

    1. 数据库引擎不支持事务 这里以 MySQL为例,MyISAM引擎是不支持事务操作的,一般要支持事务都会使用InnoDB引擎,根据MySQL 的官方文档说明,从MySQL 5.5.5 开始的默认存储引擎是 InnoDB,之前默认的都是 MyISAM,所以这一点要值得注意,如果底层引擎不支持事务,那么再怎么设置也

    2024年02月16日
    浏览(29)
  • 面试官让列举Spring的事务会失效的场景,我说了8个

    本文分享自华为云社区《哪些场景下Spring的事务会失效?》,作者:冰 河 。 在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。 今天,我们就一起梳理下有哪

    2024年02月11日
    浏览(29)
  • mybatis事物是如何和spring事物整合的

    目录 1、mybatis事物管理器 2、SpringManagedTransactionFactory如何处理事物 3、spring事物如何设置connection连接到threadLocal 1、mybatis事物管理器 mybatis事物抽象接口类:Transaction。该接口定义了事物基本方法和获取数据库连接方法  该类有三个实现类JdbcTransaction、ManagedTransaction、SpringMan

    2024年02月15日
    浏览(31)
  • spring的事物

    这是我第三次接触事物了,mysql一次,以前的也看过一次。 事物的四大特点: 原子性: 多条sql保证同时成功,同时失败。 一致性: 在事物的开启和结束,数据库的完整性不被破坏。 隔离性: 多线程时,要保证数据的安全,也就是并发安全。 持久性: 事物处理后,对数据

    2024年02月07日
    浏览(22)
  • spring事物初始化过程分析

    1.注入4个bd 2.执行 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation 逻辑分析:遍历所有的bd: 获取beanname-判断beanname是否有长度并且没有被处理过-是否遍历放入advisedBeans- 是否是基础类-是否该跳过  4大基础类 3.执行org.springframework.aop.framework.autoprox

    2024年02月02日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包