美文网首页
Spring嵌套事务原理

Spring嵌套事务原理

作者: 晚歌歌 | 来源:发表于2020-03-03 18:28 被阅读0次

Spring 采用保存点(Savepoint)实现嵌套事务原理

Spring采用一个物理事务,但是结合着savepoint机制(MySql中称为保存点)实现一个事务中的指定范围提交。
当某个方法将Spring事务传播级别设置为PROPAGATION_NESTED的时候,如果创建事务时已经存在了一个事务,则会创建一个嵌套事务。

//创建保存点
AbstractPlatformTransactionManager. handleExistingTransaction
status.createAndHoldSavepoint();

//提交事务成功释放保存的保存点
AbstractPlatformTransactionManager.processCommit
status.releaseHeldSavepoint();

//如果有保存点,同样是对当前保存点进行回滚,
//依此达到部分回滚的功能
AbstractPlatformTransactionManager. processRollback
status.rollbackToHeldSavepoint();

案例:
解惑 spring 嵌套事务

class A {
    public void invoke() {
        try {
            new B().invoke();
        catch (Exception e) {
            new C().invoke();
        }
        // 此处可能还有其他业务代码
        ...
    };
}

class B {
    public void invoke() {};
}

class C {
    public void invoke() {};
}

不论使用REQUIRES_NEW或是NESTED,在调用B的invoke时如果发生异常,都能正确完成业务逻辑

  • REQUIRES_NEW`执行到B时,A事物被挂起,B会新开了一个事务进行执行,B发生异常后,B中的修改都会回滚,然后外部事物继续执行

  • NESTED执行到B时,会创建一个savePoint,如果B中执行失败,会将数据回滚到这个savePoint
    重点来了,如果B处正常执行,就会产生区别了

  • REQUIRES_NEW`如果B正常执行,则B中的数据在A提交之前已经完成提交,其他线程已经可见其修改,这就意味着可能有脏数据的产生;同时,如果接下来A的其他逻辑发生了异常,A回滚,但是B已经完成提交,不会回滚了。当然,如果A接下来的逻辑没有相关要求,那就无所谓了

  • NESTED`如果B正常执行,此时B中的修改并不会立即提交,而是在A提交时一并提交,如果A下面的逻辑中发生异常,A回滚时,B中的修改也会回滚,就可以避免上述情况的发生

相关文章

  • Spring嵌套事务原理

    Spring 采用保存点(Savepoint)实现嵌套事务原理Spring采用一个物理事务,但是结合着savepo...

  • 面前温习

    Spring事务传播特性的浅析——事务方法嵌套调用的迷茫 解惑 spring 嵌套事务

  • Spring事务完全解析

    事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌...

  • Spring事物原理完全解析

    事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌...

  • Spring事务传播性和隔离机制

    1.Spring事务传播性 在事务出现嵌套的时候,嵌套的事务是各自独立commit,还是内层的事务合并到外层的事务...

  • 程序员之Spring

    1. Spring事务 spring的事务实现原理Spring事务将connection放入到当前线程的threa...

  • Spring事务的传播属性和事务隔离级别

    事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...

  • 事务的传播机制

    事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...

  • 事务的传播机制和回滚策略(暂时没有整理完)

    事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...

  • 分布式事务(2)Spring事务

    2.1 Spring事务原理 Spring支持编程式事务和声明式事务。编程式事务就是用个事务类Transactio...

网友评论

      本文标题:Spring嵌套事务原理

      本文链接:https://www.haomeiwen.com/subject/wxhklhtx.html