返回
Spring 事务全解析:3 步开启、提交和回滚
后端
2023-08-05 20:22:48
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. 什么是传播行为?
传播行为控制事务如何在方法调用之间传播。