zoukankan      html  css  js  c++  java
  • Spring 事务失效场景总结

    本文为博主原创,未经允许不得转载:

      1. spring的事务注解@Transactional只能放在public修饰的方法上才起作用,如果放在其他非public(private,protected)方法上,虽然不报错,但是事务不起作用

      2.如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB引擎

      3.在业务代码中如果抛出RuntimeException异常,事务回滚;但是抛出Exception,事务不回滚;

      4. 如果在加有事务的方法内,使用了try...catch..语句块对异常进行了捕获,而catch语句块没有throw  new RuntimeExecption异常,事务也不会回滚

      5. 方法调用问题

        比如下面代码,m2 方法上添加了事务功能,但是此时如果外面直接调用 m1 方法,此时 m2 的事务将失效,因为必须通过代理对象直接调用@Transaction 的方法时,事务才会起效,而 m1 方法中是通过 this 来调用 m2 方法的,而 this 是当前对象,并不是代理对象.

    @Component
    public class DemoService {
        public void m1(){
            this.m2();
        }
    
        @Transactional
        public void m2(){
            //执行db操作
        }
    }

      

      6. 业务代码和 spring 事务未在一个线程中

      比如下面代码,在新的线程中去执行 db 操作,此时事务是失效的,程序需要确保 db 操作的代码和 spring 事务必须在同一个线程中,否则事务不受 spring 控制。

    @Transactional
    public void m1() {
        new Thread() {
            一系列事务操作
        }.start();
    }
  • 相关阅读:
    Android之Parcel
    Android常用的IPC通信
    Android之Surface绘制原理
    Android之Surface
    Android之SurfaceFlinger服务
    Android Service(服务)
    Android Service进阶之路
    Android之UI线程启动
    Android之Activity显示原理
    python17-Django进阶
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/15208397.html
Copyright © 2011-2022 走看看