什么是事务管理器?
在Spring框架中,事务管理器是一个核心组件,负责协调和管理数据库事务的整个生命周期。它就像一个尽职的管家,确保所有的数据库操作都能按照预期进行,维护数据的一致性和完整性。
事务管理器的核心功能
1. 事务生命周期管理
- 开启事务:为每个事务创建新的开始点
- 提交事务:确认所有更改
- 回滚事务:在发生错误时撤销所有更改
- 管理事务边界:明确定义事务的开始和结束
2. 事务属性控制
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRED,
timeout = 30,
readOnly = false,
rollbackFor = Exception.class
)
3. 资源管理
事务管理器负责:
- 数据库连接的获取和释放
- 确保事务内的操作使用相同的连接
- 连接池的管理和优化
常见的事务管理器类型
1. DataSourceTransactionManager
适用于单数据源场景
@Configuration
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
2. JpaTransactionManager
适用于JPA应用
@Configuration
public class JpaTransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
}
3. JtaTransactionManager
适用于分布式事务场景
@Configuration
public class JtaConfig {
@Bean
public JtaTransactionManager transactionManager() {
return new JtaTransactionManager();
}
}
实战示例
转账场景示例
@Service
public class BankService {
@Autowired
private AccountDao accountDao;
@Transactional(isolation = Isolation.READ_COMMITTED,rollbackFor = Exception.class)
public void transfer(String fromAccount, String toAccount, BigDecimal amount) {
// 检查余额
Account from = accountDao.findByAccountNumber(fromAccount);
if (from.getBalance().compareTo(amount) < 0) {
throw new InsufficientBalanceException("余额不足");
}
// 扣除转出账户金额
accountDao.deduct(fromAccount, amount);
// 增加转入账户金额
accountDao.add(toAccount, amount);
}
}
最佳实践
1. 事务边界设置
- 将事务边界设置在服务层而不是DAO层
- 避免事务方法之间的相互调用
- 事务方法应该尽可能简短精炼
2. 异常处理
@Transactional(rollbackFor = {BusinessException.class,DataAccessException.class})
public void businessOperation() {
try {
// 业务逻辑
} catch (Exception e) {
log.error("业务操作失败", e);
throw new BusinessException("操作失败,请重试");
}
}
3. 性能优化建议
- 合理设置事务超时时间
- 对只读操作使用readOnly=true
- 选择适当的隔离级别
- 避免长事务
- REQUIRED:最常用,如果当前没有事务则创建新事务
- REQUIRES_NEW:总是创建新事务
- SUPPORTS:支持当前事务,如果没有则以非事务方式执行