前言
事务管理是企业级应用开发中不可或缺的一部分,它确保数据操作的一致性和完整性。Spring框架提供了强大而灵活的事务管理机制,本文将深入探讨Spring事务的基础知识、实现方式及最佳实践。
一、事务基本概念
1.1 事务的ACID特性
- 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败
- 一致性(Consistency):事务执行前后数据保持一致状态
- 隔离性(Isolation):多个事务之间相互隔离,互不干扰
- 持久性(Durability):事务提交后,对数据的修改永久保存
1.2 事务隔离级别
Spring支持以下隔离级别:
- DEFAULT:使用数据库默认隔离级别
- READ_UNCOMMITTED:允许读取未提交的数据变更
- READ_COMMITTED:只允许读取已提交的数据变更
- REPEATABLE_READ:确保同一事务中多次读取同一数据的结果一致
- SERIALIZABLE:最高隔离级别,强制事务串行执行
1.3 事务传播行为
Spring定义了7种事务传播行为:
- REQUIRED(默认):如果当前存在事务,则加入该事务;否则创建新事务
- SUPPORTS:如果当前存在事务,则加入该事务;否则以非事务方式执行
- MANDATORY:必须在现有事务中执行,否则抛出异常
- REQUIRES_NEW:创建新事务,挂起当前事务
- NOT_SUPPORTED:以非事务方式执行,挂起当前事务
- NEVER:以非事务方式执行,如果存在现有事务则抛出异常
- NESTED:如果当前存在事务,则在嵌套事务内执行;否则创建新事务
二、Spring事务管理实现方式
2.1 编程式事务管理
通过TransactionTemplate手动管理事务:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private UserRepository userRepository;
@Override
public User createUser(User user) {
return transactionTemplate.execute(status -> {
try {
// 业务逻辑
User savedUser = userRepository.save(user);
// 可能抛出异常的操作
if (savedUser == null) {
status.setRollbackOnly();
return null;
}
return savedUser;
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
});
}
}
2.2 声明式事务管理
通过@Transactional注解声明事务:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
rollbackFor = Exception.class)
public void transferMoney(Long fromUserId, Long toUserId, double amount) {
// 扣减转出用户余额
User fromUser = userRepository.findById(fromUserId).orElseThrow();
fromUser.setBalance(fromUser.getBalance() - amount);
userRepository.save(fromUser);
// 可能抛出异常的操作
if (amount > 1000) {
throw new RuntimeException("单笔转账金额不能超过1000元");
}
// 增加转入用户余额
User toUser = userRepository.findById(toUserId).orElseThrow();
toUser.setBalance(toUser.getBalance() + amount);
userRepository.save(toUser);
}
}
三、事务配置与启用
3.1 基于Java配置的事务管理器
@Configuration
@EnableTransactionManagement // 启用事务管理
public class