spring事务如何控制注解

fiy 其他 19

回复

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

    Spring事务的控制注解主要有两种:@Transactional和@TransactionManagement。

    1. @Transactional注解:
      @Transactional注解是Spring中最常用的事务控制注解,它可以应用在类级别或方法级别。当应用在类级别时,它会被应用到类的所有public方法上;当应用在方法级别时,它只会被应用到该方法上。

      @Transactional注解提供了一系列属性来配置事务的行为,如事务隔离级别、是否只读、回滚规则等。常用的属性有:

      • isolation:事务的隔离级别,默认是Isolation.DEFAULT。
      • propagation:事务的传播行为,默认是Propagation.REQUIRED。
      • readOnly:是否只读事务,默认是false。
      • rollbackFor:指定哪些异常会引起事务回滚,默认是空数组。
      • noRollbackFor:指定哪些异常不会引起事务回滚,默认是空数组。

      例如,将@Transactional注解应用在方法上:

      @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
      public void saveUser(User user) {
          // 事务处理逻辑
      }
      
    2. @TransactionManagement注解:
      @TransactionManagement注解用于在类级别声明一个事务管理器,它可以应用在类上。当应用在类上时,它会让Spring自动检测和管理使用@Transactional注解声明的事务。

      例如,将@TransactionManagement注解应用在类上:

      @TransactionManagement
      public class UserServiceImpl implements UserService {
          // 省略其他方法实现
      }
      

      在这种情况下,Spring会自动检测该类中使用@Transactional注解的方法,并根据注解的配置进行事务管理。

    综上所述,通过使用@Transactional注解可以在Spring中控制事务的行为,而使用@TransactionManagement注解可以让Spring自动管理使用@Transactional注解声明的事务。这两种注解的结合使用可以灵活地控制事务的行为。

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

    Spring事务的注解方式有多种,包括使用@Transactional注解和使用@TransactionalAdvice注解。下面将具体介绍这两种注解方式的使用方法和功能。

    1. @Transactional注解:
      @Transactional注解是Spring中最常见的事务注解。可以将该注解放在方法上或类上,用于标识这是一个需要进行事务管理的方法或类。示例代码如下:

      @Transactional
      public void doSomething(){
          // 事务逻辑
      }
      

      注意事项:

      • @Transactional注解默认只对未被检查异常(RuntimeException及其子类)进行回滚操作。如果需要对所有异常进行回滚,可以使用@Transactional(rollbackFor = Exception.class)。
      • @Transactional注解还可以指定事务的传播行为(Propagation)、隔离级别(Isolation)、只读性(readOnly)等属性。
      • 作用于类上的@Transactional注解,会应用于该类的所有方法。
    2. @TransactionalAdvice注解:
      @TransactionalAdvice注解是Spring Boot在2.5.0版本中引入的新注解。它可以用于程序的切面类中,用于对方法进行事务控制。示例代码如下:

      @Aspect
      @TransactionalAdvice
      public class MyAspect {
      
          @Around("@annotation(MyAnnotation)")
          public Object around(ProceedingJoinPoint pjp){
              Transactional transactional = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(Transactional.class);
              // 获取事务属性
              // ...
              // 进行事务控制
              return pjp.proceed();
          }
      }
      

      注意事项:

      • @TransactionalAdvice注解需要配合@Aspect注解一起使用,用于将类声明为切面类。
      • 在@Around注解中,可以通过获取方法上的@Transactional注解,获取事务的属性进行事务控制。
    3. 需要注意的事项:

      • 在Spring中,使用@Transactional注解进行事务控制时,需要确保事务管理器已经配置正确,并且切面类的扫描路径正确配置。
      • 使用@TransactionalAdvice注解时,需要注意切面类的扫描路径和切点表达式的配置是否正确。
      • 在业务层方法内部调用其他业务层方法时,事务控制会失效。这是因为Spring默认使用基于代理的事务机制,调用内部方法不会经过代理对象。
    4. 推荐使用的方式:

      • 对于简单的事务控制场景,推荐使用@Transactional注解。它简单易用,适合大部分的事务管理需求。
      • 对于复杂的事务控制场景,可以考虑使用@TransactionalAdvice注解。它提供了更灵活的控制方式,能够满足更多特殊需求。
    5. 注意事务的传播行为:

      • REQUIRED:如果当前不存在事务,则创建一个新事务;如果已经存在事务,则加入到当前事务中。
      • REQUIRES_NEW:无论当前是否存在事务,都创建一个新事务。如果当前存在事务,则暂停当前事务。
      • SUPPORTS:如果当前存在事务,则加入到当前事务中;如果不存在事务,则以非事务的方式执行。
      • NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,则暂停当前事务。
      • MANDATORY:如果当前存在事务,则加入到当前事务中;如果不存在事务,则抛出异常。
      • NEVER:以非事务的方式执行操作,如果当前存在事务,则抛出异常。

    总结:
    Spring事务可以通过@Transactional注解和@TransactionalAdvice注解进行控制。@Transactional注解是常用的注解方式,可以标识需要进行事务管理的方法或类。@TransactionalAdvice注解是Spring Boot 2.5.0新增的注解,可以用于切面类中对方法进行事务控制。在使用事务注解时,需要注意事务管理器的配置、切面类的扫描路径和切点表达式的配置,以及事务的传播行为等。对于简单的事务控制场景,建议使用@Transactional注解;对于复杂的事务控制场景,可以考虑使用@TransactionalAdvice注解。

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

    Spring事务注解是一种方便的方式来控制事务行为。通过使用注解,可以在方法上直接标识事务的属性和行为,从而实现对事务的控制。下面我们将详细介绍Spring事务注解的使用方法和操作流程。

    1. 添加事务管理器和启用事务注解支持
      首先,在Spring的配置文件中添加事务管理器,并启用事务注解的支持。在配置文件中使用tx:annotation-driven/标签来启用事务注解支持,并且在bean中配置事务管理器。
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    
    1. 标识需要进行事务控制的方法
      接下来,在需要进行事务控制的方法上添加相关的注解。Spring提供了几种常用的事务注解,包括:
    • @Transactional:用于标识一个方法需要进行事务管理。
    • @Transactional(propagation = Propagation.REQUIRED):指定事务的传播行为,默认为REQUIRED方式。
    • @Transactional(readOnly = true):指定事务的读写属性,默认为可写(false)。

    在方法上使用@Transactional注解来标识需要进行事务管理的方法。例如:

    @Transactional
    public void updateUser(User user) {
        // 更新用户信息的相关操作
    }
    
    1. 设置事务的传播行为
      @Transactional注解还可以设置事务的传播行为,以控制事务的行为。常用的传播行为包括:
    • Propagation.REQUIRED:如果当前存在事务,则加入到当前事务中;如果没有事务,则创建一个新的事务。
    • Propagation.REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务,如果存在事务则挂起当前事务。
    • Propagation.NESTED:如果当前存在事务,则在一个嵌套的事务中执行;如果没有事务,则创建一个新的事务。

    例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void updateUser(User user) {
        // 更新用户信息的相关操作
    }
    
    1. 设置事务的回滚条件
      @Transactional注解还可以设置事务的回滚条件,以控制事务在满足一定条件时回滚。常用的回滚条件包括:
    • rollbackFor:指定异常类,当发生指定类的异常时回滚事务。
    • noRollbackFor:指定异常类,当发生指定类的异常时不回滚事务。

    例如:

    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        // 更新用户信息的相关操作
    }
    
    1. 设置事务的超时时间
      @Transactional注解还可以设置事务的超时时间,以控制事务的执行时间。超过设置的超时时间,事务将被强制回滚。例如:
    @Transactional(timeout = 5)
    public void updateUser(User user) {
        // 更新用户信息的相关操作
    }
    
    1. 使用@Transactional注解注意事项
      在使用@Transactional注解时,需要注意以下几点:
    • @Transactional注解只能用于public方法上,对于private、protected和默认访问级别的方法不起作用。
    • @Transactional注解只能应用于Spring管理的Bean中,对于自己创建的对象或非Spring容器管理的Bean中的方法,不会生效。
    • @Transactional注解只能在调用被注解方法的外部类的方法上生效,如果在同一个类中调用被注解的方法,注解将不会生效。
    • @Transactional注解只能应用于实现类的方法上,而不能应用于接口的方法上。

    以上就是使用Spring事务注解控制事务的方法和操作流程。通过使用@Transactional注解,可以方便地控制事务的行为,提高代码的可读性和可维护性。

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

400-800-1024

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

分享本页
返回顶部