spring事务是如何传递的

不及物动词 其他 18

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    spring事务是通过将事务传递给调用链中的各个方法来实现的。当一个方法调用另一个方法时,如果调用者方法已经开启了事务,那么被调用方法将会沿着调用链继续使用同一事务。如果被调用方法没有单独开启事务,则将复用调用者方法的事务。

    具体来说,spring事务传递有以下几种方式:

    1. REQUIRED传播行为:被调用方法会在当前事务下运行。如果当前没有事务存在,就会创建一个新的事务。
    2. REQUIRES_NEW传播行为:被调用方法会创建一个新的事务,如果当前已经存在事务,则将当前事务挂起。
    3. SUPPORTS传播行为:被调用方法会尝试在当前事务环境中运行。如果当前没有事务存在,被调用方法会以非事务方式运行。
    4. NOT_SUPPORTED传播行为:被调用方法会以非事务方式运行,即使当前存在事务,也会将其挂起。
    5. MANDATORY传播行为:被调用方法要求在一个已存在的事务中运行。如果当前没有事务存在,将抛出异常。
    6. NEVER传播行为:被调用方法要求在没有事务的环境下运行。如果当前存在事务,则抛出异常。

    spring事务的传播行为可以通过@Transactional注解来指定。例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
    // 调用methodB
    methodB();
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB() {
    // 事务逻辑
    }

    在上述例子中,methodA被标记为REQUIRED传播行为,而methodB被标记为REQUIRES_NEW传播行为。当methodA调用methodB时,methodB将会在一个全新的事务中运行,而不是复用methodA的事务。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring事务的传递是通过TransactionPropagation属性来控制的。事务的传递性是指在一个事务中调用另一个带有事务的方法时,事务是如何传递的。

    以下是Spring事务传递的几种常见方案:

    1. REQUIRED:如果当前存在事务,则加入该事务中,如果不存在事务,则新建一个事务。这是默认的传播行为。

    2. SUPPORTS:如果当前存在事务,则加入该事务中,如果不存在事务,则以非事务方式执行。

    3. MANDATORY:如果当前存在事务,则加入该事务中,如果不存在事务,则抛出异常。

    4. REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务。如果存在事务,则挂起当前事务。

    5. NOT_SUPPORTED:以非事务方式执行,并且如果当前存在事务,则挂起当前事务。

    6. NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

    7. NESTED:如果当前存在事务,则在当前事务的内部创建一个嵌套事务。嵌套事务是依赖于当前事务的,外部事务的回滚不会影响到嵌套事务,但是内部事务的回滚会影响到外部事务。

    通过设置TransactionPropagation属性,可以灵活地控制事务的传递行为,以满足不同的业务需求。

    需要注意的是,在Spring中,事务的传播性只适用于声明式事务,即通过注解或XML配置的方式来管理事务。对于编程式事务,事务的传播性需要手动控制。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务的传递是通过事务的传播行为来实现的。在Spring中,事务可以分为多个层次,当一个事务方法调用另一个事务方法时,事务的传播行为决定了两个方法之间的事务如何进行传递和管理。

    在Spring中,事务的传播行为有以下几种:

    1. REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务,则创建一个新的事务。这是默认的传播行为。

    2. SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务地执行。

    3. MANDATORY:如果存在一个事务,支持当前事务。如果没有事务,则抛出异常。

    4. REQUIRES_NEW:创建一个新的事务,如果存在一个事务,则将当前事务挂起。

    5. NOT_SUPPORTED:以非事务方式执行操作,如果存在一个事务,则将当前事务挂起。

    6. NEVER:以非事务方式执行操作,如果存在一个事务,则抛出异常。

    7. NESTED:如果存在一个事务,则在嵌套事务内执行。如果没有事务,则执行与REQUIRED传播行为类似的操作。

    下面以具体的方法调用为例,来说明Spring事务的传递过程:

    假设有三个方法:methodA、methodB和methodC,它们都被声明为事务方法。

    @Transactional
    public void methodA(){
        //...
        methodB();
        //...
    }
    
    @Transactional
    public void methodB(){
        //...
        methodC();
        //...
    }
    
    @Transactional
    public void methodC(){
        //...
    }
    
    1. 如果methodA调用methodB,methodB调用methodC。如果methodA和methodB都在同一个事务中执行(使用REQUIRED传播行为),那么methodC也将在同一个事务中执行。

    2. 如果methodA不在事务中执行(使用NOT_SUPPORTED传播行为),methodB也不在事务中执行(使用REQUIRES_NEW传播行为),那么methodC将在一个新事务中执行。

    这样,Spring通过事务的传播行为来管理事务的传递和隔离,使得事务的管理更加灵活和方便。同时,根据实际需求,可以选择合适的传播行为来控制事务的执行方式。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部