返回

Spring 事务全解析:3 步开启、提交和回滚

后端

Spring 事务管理:全面指南

什么是事务?

事务是一个原子操作序列,其中包含对数据库的多个操作。事务确保要么所有操作都成功执行,要么都不执行。换句话说,事务要么完全成功,要么完全失败,不会出现介于两者之间的状态。

Spring 中的事务管理

Spring 提供了全面的事务管理支持,使开发人员能够轻松地管理事务。Spring 中的事务管理涉及三个关键步骤:

1. 开启事务

TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());

2. 提交事务

transactionManager.commit(status);

3. 回滚事务

transactionManager.rollback(status);

事务隔离级别

Spring 提供了四种事务隔离级别,用于控制事务之间如何相互交互:

  • READ_UNCOMMITTED: 允许一个事务看到另一个事务未提交的数据。
  • READ_COMMITTED: 只允许一个事务看到另一个事务已提交的数据。
  • REPEATABLE_READ: 保证一个事务不会看到另一个事务已提交的数据被修改。
  • SERIALIZABLE: 最严格的事务隔离级别,它保证一个事务不会看到另一个事务已提交的数据被修改,也不会看到另一个事务未提交的数据。

事务传播行为

Spring 提供了七种事务传播行为,用于控制事务如何传播到方法调用:

  • PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
  • PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • PROPAGATION_REQUIRES_NEW: 创建一个新的事务,并挂起当前事务(如果有的话)。
  • PROPAGATION_NOT_SUPPORTED: 以非事务方式执行,并挂起当前事务(如果有的话)。
  • PROPAGATION_NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED: 创建一个嵌套事务,该嵌套事务与当前事务共享相同的连接。

事务超时时间

Spring 允许为事务设置超时时间。如果一个事务在超时时间内没有提交或回滚,则该事务将被自动回滚。

Spring 事务实战

以下是一个 Spring 事务的实战示例:

@Transactional
public void transferMoney(int fromAccountId, int toAccountId, int amount) {
    Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow(() -> new RuntimeException("Account not found"));
    Account toAccount = accountRepository.findById(toAccountId).orElseThrow(() -> new RuntimeException("Account not found"));

    fromAccount.setBalance(fromAccount.getBalance() - amount);
    toAccount.setBalance(toAccount.getBalance() + amount);

    accountRepository.save(fromAccount);
    accountRepository.save(toAccount);
}

结论

Spring 事务管理是一个强大的工具,可以简化数据库事务的管理。了解 Spring 事务管理的各个方面对于开发健壮和可靠的应用程序至关重要。

常见问题解答

1. 什么是事务边界?

事务边界是指事务开始和结束的点。

2. 什么时候应该使用事务?

当需要确保数据库操作要么完全成功,要么完全失败时,应该使用事务。

3. 如何处理事务中的异常?

事务中的异常应该在 catch 块中处理并适当回滚事务。

4. 什么是隔离级别?

隔离级别控制事务之间如何交互。

5. 什么是传播行为?

传播行为控制事务如何在方法调用之间传播。