spring传播性怎么配置

不及物动词 其他 30

回复

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

    Spring传播行为可以通过配置事务管理器来实现。在Spring中,可以使用@Transactional注解或配置文件的方式来配置事务的传播行为。

    1. 使用@Transactional注解配置传播行为:
      在需要进行事务管理的方法上添加@Transactional注解,并指定事务的传播行为。@Transactional注解有一个属性propagation,用于指定事务的传播行为。常用的传播行为有:

      • PROPAGATION_REQUIRED(默认值):如果当前没有事务,则创建一个新事务,如果已存在事务,则加入该事务。
      • PROPAGATION_REQUIRES_NEW:创建一个新事务,并且暂停当前事务(如果存在)。
      • PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务,如果没有事务,则以非事务的方式执行。
      • PROPAGATION_NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,则挂起该事务。
      • PROPAGATION_MANDATORY:强制要求当前存在事务,否则抛出异常。
      • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务中执行,如果没有事务,则创建一个新事务。

    示例:

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // ...
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB() {
        // ...
    }
    
    1. 使用配置文件配置传播行为:
      在Spring的配置文件中,通过配置tx:advice标签来定义事务管理器,并使用tx:method标签来配置各个方法的传播行为。

    示例:

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="methodA" propagation="REQUIRED"/>
            <tx:method name="methodB" propagation="REQUIRES_NEW"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.example.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
    </aop:config>
    

    以上是配置事务传播行为的两种常用方式,根据需要选择适合的方式进行配置。配置后,Spring会根据指定的传播行为来管理事务的处理过程。

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

    在Spring中,可以通过配置传播性(Propagation)来定义事务在方法调用过程中的行为。传播性决定了事务是如何在方法调用过程中传播和处理的。下面是配置Spring事务传播性的几种常见方式:

    1. 通过@Transactional注解配置传播性:最常用的方式是在方法上使用@Transactional注解来配置传播性。可以通过设置@Transactional的属性propagation来指定事务的传播行为。例如:
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // ...
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB() {
        // ...
    }
    

    这里的Propagation.REQUIRED表示当前方法应该在一个事务中执行,如果当前不存在事务,就创建一个新的事务。而Propagation.REQUIRES_NEW表示当前方法应该每次都创建一个新的事务。

    1. 通过XML配置文件配置传播性:除了使用注解方式,还可以使用XML配置文件来配置传播性。需要在XML配置文件中使用tx:advice和tx:attributes标签,并设置propagation属性来指定传播行为。例如:
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="methodA" propagation="REQUIRED"/>
            <tx:method name="methodB" propagation="REQUIRES_NEW"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.*.*(..))"/>
    </aop:config>
    

    这里的propagation属性的值与@Transactional中的propagation属性的值是对应的。

    1. 通过编程方式配置传播性:除了使用注解和XML配置文件,还可以使用编程方式来配置传播性。可以通过TransactionTemplate和TransactionDefinition对象来实现。例如:
    public class TransactionalService {
        private TransactionTemplate transactionTemplate;
    
        public TransactionalService(PlatformTransactionManager transactionManager) {
            this.transactionTemplate = new TransactionTemplate(transactionManager);
        }
    
        public void methodA() {
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    // ...
                }
            });
        }
    
        public void methodB() {
            TransactionDefinition txDef = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            transactionTemplate.setPropagationBehavior(txDef.getPropagationBehavior());
    
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    // ...
                }
            });
        }
    }
    

    这里的TransactionDefinition中的PROPAGATION_REQUIRES_NEW表示当前方法的事务传播行为是REQUIRES_NEW。

    1. 通过注解和XML配置文件混合配置传播性:Spring还允许混合使用注解和XML配置文件来配置传播性。例如,可以在XML配置文件中声明一个Advice,然后在注解中引用该Advice来配置传播性。例如:
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="methodA"/>
            <tx:method name="methodB"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.*.*(..))"/>
    </aop:config>
    
    @Transactional(propagation = Propagation.REQUIRED, value = "txAdvice")
    public void methodA() {
        // ...
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW, value = "txAdvice")
    public void methodB() {
        // ...
    }
    

    在这种配置方式中,@Transactional注解中的value属性引用了XML配置文件中的txAdvice。

    1. 其他传播性配置方式:除了上述几种常见的传播性配置方式外,Spring还提供了一些其他的传播性配置方式,如PROPAGATION_SUPPORTS、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER等。这些传播性可以根据业务需求来选择和配置。

    要注意的是,传播性只有在方法调用过程中才会起作用,如果调用了另一个类的方法,那个类的事务传播性又会根据配置进行处理。因此,在设置传播性时要确保方法的调用顺序和传播性的设置符合要求。

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

    在Spring中,事务的传播性可以通过Spring的@Transactional注解来配置。@Transactional注解是应用于方法、类或接口上的注解,用于声明一个方法需要执行在事务中。通过@Transactional注解,可以配置事务的传播性,并可以指定事务的隔离级别、超时时间和是否只读等属性。

    Spring框架提供了7种不同的事务传播性类型,分别为:

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

    使用@Transactional注解配置事务的传播性时,可以在注解中通过propagation属性指定传播性的类型。例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void insert(User user) {
        // 代码逻辑
    }
    

    在以上示例中,通过@Transactional注解配置了事务的传播性为REQUIRED类型。如果当前没有事务,就新建一个事务,如果已经存在一个事务中,就加入到这个事务中。

    除了传播性类型之外,还可以通过isolation属性指定事务的隔离级别,默认为Isolation.DEFAULT。还可以通过timeout属性指定事务的超时时间,默认为-1(永不超时)。另外,还可以通过readOnly属性指定事务是否为只读事务,默认为false。

    总结一下,Spring框架提供了通过@Transactional注解来配置事务的传播性。通过propagation属性可以指定传播性的类型,通过isolation属性可以指定事务的隔离级别,通过timeout属性可以指定事务的超时时间,通过readOnly属性可以指定事务是否为只读事务。根据具体的需求,选择合适的传播性类型来处理事务的逻辑。

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

400-800-1024

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

分享本页
返回顶部