spring事务失效解决方案,spring事务不生效
1.如果使用mysql,Spring事务最终依赖的数据库的执行引擎是innodb因为只有innoDB支持事务。
2.Spring的事务原理是aop,所以处理室应该由bean中的Spring容器来管理;New自己的对象肯定不行。
3.Spring事务标记@Transactional必须在public方法上进行注释。私有的、受保护的、默认的和最终修饰的方法或类,以及静态方法,事务将是无效的。
4.如果在同一个类中调用内部方法,事务将无效。这被调用,下图中updateOrder上的事务将无效。您可以定义另一个服务,并调用服务中的updateOrder来生效。
5.多线程调用事务将无效。事务建立在同一个数据链路上,多个线程可能得到的连接不是同一个连接,所以事务会无效。下图中的DoOtherThing()抛出异常,无法使add回滚。
6.事务传播。当@Transactional被注释时,您可以指定传播参数,扩展其配置不支持事务。
传播。NOT_SUPPORTED,这种类型的传播功能不支持事务。如果有事务,将抛出异常。
目前,只有这三个传播特性会创建新的事务:nested、requires _ new和required。
7.遇到异常时,如果是RuntimeException,则回滚;不然就不行了。除非@ transactional(roll back for=exception . class)是自定义的,否则此配置仅限于可抛出的异常类及其子类。
8.如果你自己吞下了异常,试一试抓住它,自然就不会滚了。
9.嵌套的事务太多,导致回滚太多。我以为我会像下面这样回滚doOtherthing(),但是如果doOtherThing抛出异常,收到add,也会回滚。更好的方法是在roleService.doOtherThing()处捕获异常。
补充说明:
而MySQL引擎是MyISAM,事务就不行了,因为MyISAM不支持事务,但是InnoDB引擎支持。Note @ Tractional只能在事务生效前添加到public修饰的方法中。如果将其添加到protect和private等非公共修饰方法中,则该事务将无效。如果异常是在事务打开的情况下通过使用方法中的try-catch语句块捕获的,并且该异常未被引发到外层,则该事务将无效。不同类之间调用方法时,异常发生在没有事务的方法A中,但不是被调用方法B生成的,被调用方法B的事务无效。只有在打开事务的方法B中出现异常时,事务才有效。总结
这就是这篇关于Spring事务失败场景的文章。有关Spring事务失败场景的更多信息,请搜索Popular IT以前的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。