spring事务如何传递

不及物动词 其他 47

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务传递是指当一个事务方法A调用另一个事务方法B时,事务如何在两个方法之间传递和管理的。当方法B被方法A调用时,事务可以选择传播给方法B,或者方法B创建一个新的事务来执行。

    在Spring中,事务传递的默认行为是REQUIRED(需要)传播行为。这意味着被调用的方法如果在一个事务中被调用,它将在该事务中运行。如果没有事务存在,方法将为自己创建一个新的事务。

    除了REQUIRED传播行为外,Spring还提供了其他几种传播行为:

    1. REQUIRED_NEW(需要新的):被调用的方法将在一个新的事务中执行,如果此时有一个事务存在,则将该事务挂起。

    2. SUPPORTS(支持):被调用的方法将使用当前的事务,如果没有事务存在,方法将在非事务状态下执行。

    3. NOT_SUPPORTED(不支持):被调用的方法将在非事务状态下执行,如果有一个事务存在,将挂起该事务。

    4. MANDATORY(强制):被调用的方法必须在一个事务中执行,如果没有事务存在,则会抛出异常。

    5. NEVER(从不):被调用的方法必须在非事务状态下执行,如果有一个事务存在,则会抛出异常。

    6. NESTED(嵌套):被调用的方法将在一个嵌套的事务中执行,该事务是父事务的一部分。如果没有父事务存在,NestED将与REQUIRED传播行为一样。

    以上是常用的事务传播行为,可以根据实际情况选择合适的行为。对于方法调用的事务传播行为的选择,可以通过在方法上使用@Transactional注解来指定。此外,Spring还提供了编程式的事务传播设置方法,可以在代码中进行手动设置。

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

    Spring事务的传递性是指当多个方法通过调用关系相互调用时,事务如何在这些方法之间传递和管理。Spring提供了多种传递事务的方式,以下是几种常见的传递性方式:

    1. PROPAGATION_REQUIRED (默认):
      当一个方法被调用时,如果调用者已经存在一个事务,那么被调用方法将在该事务内执行,如果调用者没有事务,则被调用方法将会创建一个新的事务。

    2. PROPAGATION_REQUIRES_NEW:
      当一个方法被调用时,该方法将创建一个新的事务并独立执行,即使调用者存在事务,被调用方法也不会与之共享。

    3. PROPAGATION_NESTED:
      当一个方法被调用时,如果调用者存在事务,被调用方法将在该事务的嵌套事务中执行,嵌套事务可以独立进行提交或回滚,如果调用者没有事务,则被调用方法将创建一个新的事务。

    4. PROPAGATION_SUPPORTS:
      当一个方法被调用时,如果调用者存在事务,被调用方法将在该事务内执行,如果调用者没有事务,则被调用方法将以非事务方式执行。

    5. PROPAGATION_NOT_SUPPORTED:
      当一个方法被调用时,如果调用者存在事务,被调用方法将挂起该事务并以非事务方式执行,如果调用者没有事务,则被调用方法以非事务方式执行。

    在Spring中,可以使用@Transactional注解来指定事务的传递行为。例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void method1() {
        // 业务逻辑
        method2();
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void method2() {
        // 业务逻辑
    }
    

    在上述示例中,当method1()中的业务逻辑执行时,如果method1()被调用者存在一个事务,method2()会在该事务内执行;如果method1()被调用者没有事务,method2()将创建一个新的事务并独立执行。

    通过合理地使用事务传递性,可以确保多个方法在一个事务内执行,保证数据的一致性和完整性。但是需要注意的是,事务传递性可能会引起死锁和性能问题,因此需要根据实际业务需求和场景选择合适的传递性。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring事务的传递性是指一个事务是否可以在多个方法调用中进行传递。在Spring中,事务的传递性是通过TransactionTemplate或@Transactional注解来实现的。

    1.使用TransactionTemplate传递事务
    TransactionTemplate是Spring提供的一个便捷的事务管理类,它提供了一种编程式的事务管理方式。下面是一个示例代码,演示了如何使用TransactionTemplate传递事务。

    @Autowired
    private TransactionTemplate transactionTemplate;
    
    public void methodA() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // 在这里执行事务相关的操作
                methodB();
            }
        });
    }
    
    public void methodB() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // 在这里执行事务相关的操作
            }
        });
    }
    

    在上面的例子中,methodA()、methodB()都使用了transactionTemplate.execute的方式来执行事务。当methodA()调用methodB()时,事务会自动传递到methodB(),并形成一个嵌套的事务。如果任意一个方法执行失败,事务会回滚,否则事务会提交。

    2.使用@Transactional注解传递事务
    @Transactional是Spring提供的一种声明式事务管理方式,通过在方法上添加该注解来实现事务的管理。下面是一个示例代码,演示了如何使用@Transactional注解传递事务。

    @Transactional
    public void methodA() {
        // 在这里执行事务相关的操作
        methodB();
    }
    
    @Transactional
    public void methodB() {
        // 在这里执行事务相关的操作
    }
    

    在上面的例子中,当methodA()调用methodB()时,事务会自动传递到methodB(),并形成一个嵌套的事务。如果任意一个方法执行失败,事务会回滚,否则事务会提交。

    3.事务传播行为
    在Spring中,事务的传播行为(Propagation)是用来指定事务在多个方法调用中的传播方式。Spring提供了多种事务传播行为的选择,包括REQUIRED、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED等。在使用@Transactional注解时,可以通过设置propagation属性来指定事务的传播方式。

    • REQUIRED:如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。
    • REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。
    • SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式执行。
    • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。

    例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // 在这里执行事务相关的操作
        methodB();
    }
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodB() {
        // 在这里执行事务相关的操作
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodC() {
        // 在这里执行事务相关的操作
    }
    

    在上面的例子中,methodA()、methodB()使用的事务传播行为是REQUIRED,同一个事务;而methodC()使用的事务传播行为是REQUIRES_NEW,创建了一个新的事务。所以当methodA()调用methodB()时,事务会传递;当methodA()调用methodC()时,会挂起当前事务并启动一个新的事务。

    总结:
    Spring事务的传递性通过TransactionTemplate或@Transactional注解实现。可以使用TransactionTemplate提供的编程式事务管理方式来传递事务;也可以使用@Transactional注解提供的声明式事务管理方式来传递事务。同时,可以通过设置propagation属性来指定事务的传播行为。

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

400-800-1024

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

分享本页
返回顶部