如何设置spring传播性

worktile 其他 20

回复

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

    在Spring中,事务的传播性是用来决定在一个事务正在进行时,新的方法是否加入该事务中,以及在新的方法执行完后,该事务如何处理的。

    Spring框架提供了多种事务传播行为的选择,可以通过在方法上使用@Transactional注解或者在XML配置文件中使用tx:annotation-driven元素来设置事务的传播性。

    下面介绍一些常用的事务传播行为:

    1. PROPAGATION_REQUIRED(默认值):如果当前已存在事务,则加入该事务,如果当前没有事务,则创建一个新事务。这是最常用的事务传播行为,保证了方法的执行要么在一个现有事务中,要么在新的事务中执行。

    2. PROPAGATION_REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务,并且如果当前存在事务,则将其挂起。即使外层事务回滚,新的事务也不会受到影响。

    3. PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式运行。这种传播行为适用于不需要强制使用事务的场景,如果存在事务,则在事务中执行,如果没有事务,则以非事务方式执行。

    4. PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则将其挂起。这种传播行为适用于不希望方法在事务中执行的场景,无论外层是否存在事务,方法都以非事务方式执行。

    5. PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。这种传播行为适用于一定不希望方法在事务中执行的场景,如果外层存在事务,则抛出异常。

    6. PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。这种传播行为用于强制要求方法在一个事务中执行,如果外层没有事务,则抛出异常。

    以上是一些常见的事务传播行为,通过选择合适的传播行为可以对事务进行有效管理和控制。当然,根据具体业务场景的需要,还可以自定义事务传播行为,并在方法上进行配置。

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

    Spring中的事务传播性是用来控制事务在方法调用中的传播行为。事务传播性定义了一个方法在另一个方法中调用时,事务应该如何传播的规则。在Spring中,可以通过注解或编程方式来设置事务的传播性。

    1. 注解方式设置事务传播性:
      在方法上使用@Transactional注解来设置事务的传播性。@Transactional注解有一个属性propagation,通过该属性来设置事务的传播性。常见的传播性类型有:

      • REQUIRED:默认的传播性类型,表示方法内部的事务会参与到外部方法的事务中。如果当前存在事务,则加入到该事务中;如果当前不存在事务,则创建一个新的事务。
      • REQUIRES_NEW:表示方法内部的事务会创建一个新的事务,并挂起外部的事务。如果当前存在事务,则将其挂起;如果当前不存在事务,则创建一个新的事务。
      • NESTED:表示方法内部的事务会在一个父事务中运行,如果父事务存在,则方法将在父事务的嵌套事务中运行,如果父事务不存在,则和REQUIRED传播性一样。

      通过在方法上添加@Transactional注解,并设置propagation属性,可以灵活地控制事务在方法调用中的传播行为。

    2. 编程方式设置事务传播性:
      在代码中通过TransactionTemplate来设置事务的传播性。TransactionTemplate是Spring提供的一个事务管理工具类,它可以在代码中控制事务的开始、提交、回滚等操作。

      通过TransactionTemplate的setPropagationBehavior方法来设置事务的传播性,常见的传播性类型与上述相同。

      TransactionTemplate template = new TransactionTemplate(transactionManager);
      template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
      template.execute(new TransactionCallbackWithoutResult() {
          @Override
          protected void doInTransactionWithoutResult(TransactionStatus status) {
              // 在此处进行数据库操作
          }
      });
      

      通过使用TransactionTemplate,可以在代码中更加灵活地控制事务的传播行为,特别适用于复杂的事务场景。

    3. 在分布式环境中考虑事务传播性:
      在分布式环境中,多个服务可能需要协同工作,涉及到跨服务的事务传播。Spring提供了GlobalTransactionManager来处理分布式事务的传播行为。可以通过配置文件的方式来设置事务的传播性。

    4. 注意事项:
      在设置事务传播性时,需要考虑以下几个方面:

      • 选择适合的事务传播性类型,确保事务能够按照预期的方式进行传播。
      • 考虑到事务传播的层级关系,特别是在嵌套事务的情况下,需要注意事务传播的行为。
      • 在分布式环境中,要注意事务的一致性和隔离性,确保事务的正确执行。
    5. 测试事务传播性:
      最后,为了确保事务传播性设置正确,可以编写相应的单元测试来测试事务传播的行为。在测试中,可以模拟不同的调用场景,观察事务是如何传播的,从而验证事务传播性设置的正确性。

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

    Spring提供了一种事务管理机制,可以通过设置传播性来控制事务的行为。传播性决定了一个事务如何与其他事务进行交互。

    在Spring中,事务的传播性可以通过注解或编程式的方式来设置。下面将分别介绍这两种设置传播性的方法。

    一、使用注解设置传播性

    1. 引入事务管理的相关依赖

    在pom.xml文件中添加以下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    1. 配置数据源和事务管理器

    在application.yml文件中添加以下配置:

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/test
        username: root
        password: root
      jpa:
        hibernate:
          ddl-auto: update
      jpa:
        show-sql: true
    
    1. 创建一个包含事务的服务类
    @Service
    public class UserService {
    
        @Transactional(propagation = Propagation.REQUIRED)
        public void addUser() {
            // 添加用户的逻辑
        }
    
        @Transactional(propagation = Propagation.REQUIRED)
        public void updateUser() {
            // 更新用户的逻辑
        }
    }
    

    在注解@Transactional中,设置propagation属性来设置传播性的类型。常用的传播性类型有:

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

    二、使用编程式设设置传播性

    1. 配置事务管理器

    在配置类中添加以下配置:

    @Configuration
    @EnableTransactionManagement
    public class TransactionConfig {
    
        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    }
    
    1. 在相应的方法中编写事务逻辑
    // 获取事务管理器
    @Autowired
    private PlatformTransactionManager transactionManager;
    
    public void addUser() {
        // 开启事务
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
            // 添加用户的逻辑
            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 出现异常,回滚事务
            transactionManager.rollback(status);
        }
    }
    
    public void updateUser() {
        // 开启事务
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
            // 更新用户的逻辑
            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 出现异常,回滚事务
            transactionManager.rollback(status);
        }
    }
    

    在编程式设置传播性时,需要手动获取事务管理器,并通过事务管理器开启、提交或回滚事务。

    总结:

    无论是通过注解还是编程式的方式,设置Spring事务的传播性都是非常简单的。通过合理设置传播性,可以保证事务的一致性和隔离性,提高系统的可靠性和可维护性。

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

400-800-1024

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

分享本页
返回顶部