spring事务传播行为是什么

不及物动词 其他 34

回复

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

    Spring事务传播行为是指在使用Spring框架进行事务管理时,定义了事务的传播方式。简单来说,事务传播行为决定了在一个方法调用另一个方法时,两个方法之间的事务如何进行传播和管理。

    Spring框架提供了多种事务传播行为选项,常用的有以下几种:

    1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前不存在事务,则创建一个新的事务。这种传播行为可以用于大多数的业务场景,它能够保证方法在一个事务中执行。

    2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,就以非事务的方式执行。这种传播行为适用于不需要事务支持的方法,如果方法内部需要访问数据库等资源时,可以共享调用方法的事务。

    3. MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。这种传播行为要求方法必须在一个已存在的事务中执行,否则将抛出异常。

    4. REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务,并在方法执行结束后提交或回滚。这种传播行为适用于需要独立的事务执行的方法,可以在不影响外部事务的情况下进行操作。

    5. NOT_SUPPORTED:以非事务的方式执行方法,如果当前存在事务,则将其挂起。这种传播行为适用于不需要事务支持的方法,即使外部存在事务,也可以以非事务的方式执行。

    6. NEVER:以非事务的方式执行方法,如果当前存在事务,则抛出异常。这种传播行为要求方法必须在没有事务的上下文中执行,否则将抛出异常。

    7. NESTED:如果当前存在事务,则开启一个嵌套事务并执行方法;如果当前不存在事务,则创建一个新的事务。这种传播行为可以在一个当前事务的内部创建一个新的嵌套事务,如果外部事务提交,则嵌套事务也会提交;如果外部事务回滚,则嵌套事务也会回滚。

    通过使用不同的事务传播行为,可以灵活地控制事务的行为,并根据具体业务场景来选择最合适的传播行为。在Spring中使用@Transactional注解来设置事务传播行为,也可以通过编程方式来控制事务传播行为。

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

    Spring事务传播行为是指在一个事务中,当一个方法调用另一个方法时,事务是如何传播的。Spring框架提供了多种事务传播行为来满足不同的业务需求。下面是Spring事务传播行为的五种常见类型:

    1. REQUIRED(默认):如果当前存在事务,则加入该事务,如果没有事务则创建一个新的事务。这是最常见的事务传播行为,适用于大部分场景。

    2. SUPPORTS:如果当前存在事务,则加入该事务,如果没有事务则以非事务的方式执行。也就是说,该方法可以在有或者没有事务的情况下执行,适用于不需要事务控制的方法。

    3. MANDATORY:必须在一个已存在的事务中执行,如果当前没有事务,则抛出异常。适用于需要强制要求事务的情况,如果没有事务则会抛出异常。

    4. REQUIRES_NEW:创建一个新的事务,如果当前存在事务则挂起该事务。也就是说,每个方法都会创建一个新的事务,适用于需要独立事务的场景。

    5. NOT_SUPPORTED:以非事务的方式执行方法,如果当前存在事务,则挂起该事务。也就是说,该方法不会使用事务,适用于不需要事务控制的方法。

    总结:Spring事务传播行为定义了一个方法在执行时如何与其他方法中的事务进行交互。Spring提供了多种事务传播行为类型来满足不同的业务需求。开发者可以根据具体的业务场景来选择适当的事务传播行为类型,在保证数据一致性和可靠性的同时提高系统的性能和灵活性。

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

    Spring事务传播行为是指在多个事务方法调用时,如何处理这些事务的传播关系。在Spring中,可以通过设置@Transactional注解或编程式事务管理来定义事务传播行为。

    Spring定义了七种事务传播行为:

    1. REQUIRED:如果当前已经存在事务,那么适用当前事务,否则创建一个新事务。
    2. SUPPORTS:如果当前已存在事务,那么适用当前事务;如果当前没有事务,那么以非事务的方式执行。
    3. MANDATORY:如果当前已存在事务,那么适用当前事务;如果当前没有事务,则抛出异常。
    4. REQUIRES_NEW:无论当前是否存在事务,都创建一个新事务。如果当前已存在事务,则暂停当前事务。
    5. NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,则挂起事务。
    6. NEVER:以非事务的方式执行操作,如果当前存在事务,则抛出异常。
    7. NESTED:如果当前已存在事务,则创建一个嵌套事务,嵌套在当前事务中执行。如果当前没有事务,则创建一个新事务。

    下面是各种事务传播行为的详细解释和使用场景:

    1. REQUIRED:默认传播行为,如果当前已经存在事务,则在当前事务中运行;如果当前没有事务,则创建一个新事务。适用于业务操作需要在一个事务中完成的情况,如果外层方法有事务,则内层方法也加入该事务;如果外层方法没有事务,则内层方法新建一个事务。

    2. SUPPORTS:如果当前已存在事务,则在当前事务中运行;如果当前没有事务,则以非事务的方式执行。适用于例如查询操作,不需要事务保证一致性的情况,可以允许在有事务的环境下执行;在没有事务的环境下以非事务的方式执行。

    3. MANDATORY:如果当前已存在事务,则在当前事务中运行;如果当前没有事务,则抛出异常。适用于必须在一个已存在的事务中运行的操作,例如在一个服务中调用另一个服务的事务方法。

    4. REQUIRES_NEW:无论当前是否存在事务,都创建一个新事务。如果当前已存在事务,则暂停当前事务,新建一个事务执行。适用于需要独立事务运行的操作,例如在一个事务方法中更新某个表,然后调用一个新的事务方法来处理更新后的数据。

    5. NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,则挂起事务。适用于不需要事务支持的操作,例如一个查询方法,即使外层方法有事务也不需要参与其中。

    6. NEVER:以非事务的方式执行操作,如果当前存在事务,则抛出异常。适用于不允许在事务中运行的操作,例如一个方法需要确保在没有事务的环境下运行。

    7. NESTED:如果当前已存在事务,则创建一个嵌套事务,嵌套在当前事务中执行。如果当前没有事务,则创建一个新事务。适用于需要在一个已存在的事务中运行,并且需要独立的保存或回滚点的操作,例如在一个业务逻辑方法中,调用另一个业务逻辑方法,希望这两个方法在同一个事务中运行,但又希望能够针对内层方法设置保存点或回滚点。

    使用@Transactional注解设置事务的传播行为示例:

    @Transactional(propagation = Propagation.REQUIRED)
    public void outerMethod() {
        // 外层方法
        innerMethod();
    }
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void innerMethod() {
        // 内层方法
    }
    

    使用编程式事务管理设置事务的传播行为示例:

    public void outerMethod() {
        TransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 外层方法
    
            innerMethod();
    
            transactionManager.commit(status);
        } catch (Exception ex) {
            transactionManager.rollback(status);
            throw ex;
        }
    }
    
    public void innerMethod() {
        TransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 内层方法
    
            transactionManager.commit(status);
        } catch (Exception ex) {
            transactionManager.rollback(status);
            throw ex;
        }
    }
    

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

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

400-800-1024

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

分享本页
返回顶部