Spring事务的理解(包含与mysql事务之间的联系)

导论:Spring事务有四种特性:ACID,五种隔离级别:default、read_uncommitted、read_committed、repeatable_read、serializable,七种传播行为:默认为required

一:事务的传播行为:

        也就是一个事务传到另外一个事务或者没有事务的方法上面。spring默认的事务传播行为为:PROPAGATION_REQUIRED (Propagation_required),对于声明式事务(注解的方式,可以减少代码侵入,保持代码纯粹的业务逻辑)来说,它的含义就是:如果在一个含有事务的方法中调用其他方法(没有事务)时,此时该方法也会被包含在该事务中,也就是会等全部执行完之后再进行事务的提交,而如果两个都有事务,还是methodA中调用methodB时,此时会先产生一个事务,因此methodB也用的是此事务。Spring中使用 Aop支持声明式事务,也就是用注解@Transaction时,此时代码类似于:

Connection con=null;

    try{

        con = getConnection();

        con.setAutoCommit(false);

        //方法调用

        methodB();

        //提交事务

        con.commit();

    } Catch(RuntimeException ex) {

        //回滚事务

        con.rollback();   

    } finally {

        //释放资源

        closeCon();

    }

 

如下例:

  //转账方法
    @Transactional(isolation =Isolation.REPEATABLE_READ,propagation= Propagation.REQUIRED,readOnly= false)
    public void transfer( Integer from, Integer to, Double money){
                //减钱
                ad.decreaseMoney(from, money);
                int i = 1/0;
                //加钱
                ad.increaseMoney(to, money);
            }

此案例也说明了 Aop和动态代理之间的联系,只有通过动态代理才能在该方法执行前后添加事务控制代码。

二:关于Spring事务隔离级别与Mysql事务级别之间的联系:

    Spring会在事务开始时,根据你程序中设置的隔离级别,调整数据库隔离级别与你的设置一致。
当使用Serializable级别时,Mysql在执行SQL时会自动修改为select .... lock in share mode, 即使用共享锁。此时允许同时读,但只允许一个事务写,且锁的是行而不是整张表。

这意味着:

如果数据库不支持某种隔离级别,那么Spring设置了也无效。
当使用Serializable级别时,如果两个事务读写的不是同一行,那么它们是互不影响的。如果操作同一行记录,那么允许同时读,但如果出现一个对此行的写操作,则在写事务没有提交之前,所有的读事务都会被block。

总结:

      两者本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.事务与隔离级别放在一起理解会更好些


 

你可能感兴趣的:(梦想架构师)