SpringBoot 手动事务与自动事务

6 阅读2分钟

在 SpringBoot 中,事务管理是确保数据库操作一致性的重要机制。事务分为 手动事务 和 自动事务,两者在实现方式和适用场景上有所不同。

自动事务

自动事务是通过 声明式事务 实现的,主要依赖  @Transactional 注解。Spring 会基于 AOP 拦截目标方法,在方法执行前开启事务,执行后根据结果提交或回滚事务。

使用方式

@Service

public class OrderService {

@Transactional(rollbackFor = Exception.class)

public void processOrder() {

// 数据库操作

saveOrder();

updateInventory();

}

}

复制

特点

  1. 简单快捷:无需手动管理事务,Spring 自动处理事务的开启、提交和回滚。
  2. 配置灵活:支持设置事务传播行为(如 REQUIREDREQUIRES_NEW)、隔离级别(如 READ_COMMITTED)、超时时间等。
  3. 适用场景:适合大多数常规业务逻辑。

注意事项

  • @Transactional 只能应用于 public 方法,且需通过外部调用才能生效。
  • 默认情况下,Spring 仅对 RuntimeException 及其子类进行回滚。若需对其他异常回滚,可通过 rollbackFor 属性指定。

手动事务

手动事务通过 编程式事务管理 实现,使用 PlatformTransactionManager 手动控制事务的开启、提交和回滚。

使用方式

@Autowired

private PlatformTransactionManager transactionManager;

@Autowired

private TransactionDefinition transactionDefinition;

public void manualTransaction() {

TransactionStatus status = transactionManager.getTransaction(transactionDefinition);

try {

// 数据库操作

saveOrder();

updateInventory();

// 提交事务

transactionManager.commit(status);

} catch (Exception e) {

// 回滚事务

transactionManager.rollback(status);

throw e;

}

}

复制

特点

  1. 灵活性高:开发者可以完全控制事务的生命周期。
  2. 适用场景:适用于复杂场景,例如需要在同一方法中对部分操作进行回滚,或无法使用  @Transactional 的场景。

手动回滚示例

try {

// 数据库操作

saveOrder();

} catch (Exception e) {

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

throw e;

}

复制

选择建议

  • 优先使用自动事务:声明式事务简单易用,适合大多数业务场景。
  • 使用手动事务的场景:当需要更精细的事务控制(如部分回滚)或无法使用  @Transactional 时,选择手动事务。

无论是手动事务还是自动事务,都需要注意事务的隔离级别、传播行为以及异常处理,以确保数据一致性和系统稳定性。