【793、Spring 的事务怎么做的】

140 阅读2分钟

在 Spring 框架中,事务管理是通过使用声明式事务或编程式事务来实现的。

  1. 声明式事务: Spring 提供了基于注解和基于 XML 配置的声明式事务管理。使用声明式事务,你可以将事务逻辑与业务逻辑分离。通常情况下,你只需要在方法或类上添加相应的注解或配置即可实现事务管理。

    • 基于注解的声明式事务:使用 @Transactional 注解来标记需要进行事务管理的方法或类。你可以在方法上或类上添加该注解,它会自动启用事务管理,并根据相关配置进行事务的提交或回滚。

      @Transactional
      public void performTransaction() {
          // 事务处理逻辑
      }
      
    • 基于 XML 配置的声明式事务:通过在 Spring 的配置文件中定义事务管理器和事务切面的配置来实现事务管理。首先,你需要配置一个事务管理器(例如 DataSourceTransactionManager),然后在事务切面中使用 <tx:advice> 元素指定事务属性,如传播行为、隔离级别等。

  2. 编程式事务: Spring 也支持编程式事务管理,这意味着你可以在代码中显式地使用事务管理 API 来控制事务的开始、提交和回滚。

    • 在 Java 代码中使用编程式事务管理:

      TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
      transactionTemplate.execute(status -> {
          try {
              // 执行事务逻辑
              return result;
          } catch (Exception e) {
              status.setRollbackOnly();
              throw e;
          }
      });
      
    • 在 Spring AOP 中使用编程式事务管理:你可以使用环绕通知(Around Advice)来包装需要进行事务管理的方法,在通知中手动控制事务的开始、提交和回滚。

      @Aspect
      public class TransactionAspect {
      
          @Autowired
          private PlatformTransactionManager transactionManager;
      
          @Around("execution(* com.example.service.*.*(..))")
          public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
              TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
              try {
                  Object result = joinPoint.proceed();
                  transactionManager.commit(status);
                  return result;
              } catch (Exception e) {
                  transactionManager.rollback(status);
                  throw e;
              }
          }
      }
      

无论是声明式事务还是编程式事务,都需要配置合适的事务管理器(例如 DataSourceTransactionManager)以及设置相应的事务属性(如传播行为、隔离级别等)来满足业务需求。此外,确保在 Spring 的配置文件中启用事务管理,例如通过 <tx:annotation-driven><aop:aspectj-autoproxy> 元素来开启自动代理或自动扫描事务注解。