spring中事务如何进行传播

worktile 其他 8

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring中,事务传播是指事务在不同方法之间的传递和管理。事务传播规定了一个方法调用其他方法时,事务如何在这些方法之间传播和处理。

    Spring中定义了七种事务传播行为,分别是:

    1. REQUIRED(默认):当前方法必须运行在事务中,如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务。

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

    3. MANDATORY:当前方法必须运行在事务中,如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常。

    4. REQUIRES_NEW:当前方法必须运行在一个新的事务中,如果当前存在事务,则挂起该事务,并创建一个新的事务;如果不存在事务,则新建一个事务。

    5. NOT_SUPPORTED:当前方法不需要运行在事务中,如果当前存在事务,则挂起该事务,并以非事务方式运行;如果不存在事务,则以非事务方式运行。

    6. NEVER:当前方法不能运行在事务中,如果当前存在事务,则抛出异常;如果不存在事务,则以非事务方式运行。

    7. NESTED:当前方法必须运行在一个具有保存点的嵌套事务中,如果当前存在事务,则在当前事务的保存点上创建一个嵌套事务;如果不存在事务,则新建一个嵌套事务。

    事务传播行为可以通过@Transactional注解或XML配置来设置。通常情况下,我们可以在Service层使用@Transactional注解来定义事务传播行为。例如:

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

    在上面的例子中,methodA()使用了REQUIRED传播行为,当methodA()方法被调用时,如果当前存在事务,则methodA()将加入该事务;如果不存在事务,则会新建一个事务。methodB()使用了REQUIRES_NEW传播行为,无论当前是否存在事务,methodB()都会新建一个事务来运行。

    总之,Spring提供了灵活的事务管理机制,通过事务传播行为可以灵活地控制事务的传递和处理方式,使得我们可以更加方便地管理和使用事务。

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

    Spring中事务的传播行为是通过@Transactional注解来定义的。事务的传播行为决定了如果一个事务方法被另一个事务方法调用时,应该如何处理事务。

    1. REQUIRED(默认):如果当前存在一个事务,则加入该事务,如果不存在事务,则创建一个新的事务。
      例如:
      @Transactional
      public void methodA() {
      // 事务开始
      // …
      methodB();
      // …
      // 事务结束
      }

    @Transactional
    public void methodB() {
    // methodB的业务逻辑
    }

    1. REQUIRES_NEW:每次都创建一个新的事务,如果当前存在一个事务,先将当前事务挂起。
      例如:
      @Transactional
      public void methodA() {
      // 事务开始
      // …
      methodB();
      // …
      // 事务结束
      }

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

    1. SUPPORTS:如果当前存在一个事务,则加入该事务,如果不存在事务,则以非事务的方式执行。
      例如:
      @Transactional
      public void methodA() {
      // 事务开始
      // …
      methodB();
      // …
      // 事务结束
      }

    @Transactional(propagation = Propagation.SUPPORTS)
    public void methodB() {
    // methodB的业务逻辑
    }

    1. NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在一个事务,先将当前事务挂起。
      例如:
      @Transactional
      public void methodA() {
      // 事务开始
      // …
      methodB();
      // …
      // 事务结束
      }

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void methodB() {
    // methodB的业务逻辑
    }

    1. MANDATORY:如果当前存在一个事务,则加入该事务,如果不存在事务,则抛出异常。
      例如:
      @Transactional
      public void methodA() {
      // 事务开始
      // …
      methodB();
      // …
      // 事务结束
      }

    @Transactional(propagation = Propagation.MANDATORY)
    public void methodB() {
    // methodB的业务逻辑
    }

    除了上述提到的几种传播行为外,Spring还提供了其他的传播行为如NEVER、NESTED等,开发者可以根据具体的需求选择适合的传播行为来定义事务的行为。同时,也可以通过@Transactional注解的其他属性来配置事务的隔离级别、只读属性、异常回滚规则等。

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

    Spring中事务的传播行为是通过使用@Transactional注解或者编程式事务管理来实现的。事务的传播行为指的是当一个方法被调用时,如何处理方法内部的事务。
    Spring定义了多种事务传播行为,包括:

    1. REQUIRED:如果当前没有事务,就创建一个新事务,如果已经存在一个事务中,加入到这个事务中。
    2. SUPPORTS:如果当前存在事务,就加入到这个事务中,如果当前没有事务,就以非事务的方式执行。
    3. MANDATORY:如果当前存在事务,就加入到这个事务中,如果当前没有事务,就抛出异常。
    4. REQUIRES_NEW:创建一个新事务,如果当前存在事务,暂停当前事务。
    5. NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,暂停当前事务。
    6. NEVER:以非事务的方式执行操作,如果当前存在事务,抛出异常。
    7. NESTED:如果当前存在事务,则在一个嵌套的事务中执行,如果当前没有事务,则创建一个新事务。

    下面分别介绍基于注解和编程式事务管理的使用方法:

    使用注解的方式来指定事务的传播行为,可以在方法上加上@Transactional注解,指定propagation属性来设置传播行为。例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA(){
        // 方法逻辑
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB(){
        // 方法逻辑
    }
    

    使用编程式事务管理的方式来设置事务的传播行为,可以通过TransactionTemplate类来定义事务属性。例如:

    @Autowired
    private TransactionTemplate transactionTemplate;
    
    public void methodA(){
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // 方法逻辑
            }
        });
    }
    
    public void methodB(){
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // 方法逻辑
            }
        });
    }
    

    使用上述的方法,可以根据需要来指定事务的传播行为,从而实现更灵活的事务管理。在实际应用中,需要根据具体的业务需求来选择合适的事务传播行为。

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

400-800-1024

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

分享本页
返回顶部