1. Spring 事务的核心机制
Spring 通过 声明式事务管理 (基于 AOP)简化事务操作,开发者只需通过注解 @Transactional 标记事务边界,Spring 自动管理事务的开启、提交和回滚。
关键配置要素
- 事务管理器 :
PlatformTransactionManager是核心接口(如DataSourceTransactionManager用于 JDBC)。 - 事务属性:隔离级别、传播行为、超时时间、只读模式、回滚规则。
2. 事务传播机制详解
传播行为定义了多个事务方法相互调用时的事务边界策略。Spring 定义了 7 种传播行为:
2.1 PROPAGATION_REQUIRED(默认)
- 行为:如果当前存在事务,则加入该事务;否则新建一个事务。
- 场景:适用于大多数业务逻辑(如订单创建与库存更新需在同一事务)。
2.2 PROPAGATION_SUPPORTS
- 行为:如果当前存在事务,则加入;否则以非事务方式执行。
- 场景:查询操作(可接受事务但非必需)。
2.3 PROPAGATION_MANDATORY
- 行为:必须存在事务,否则抛出异常。
- 场景:强制要求调用方提供事务(如审计日志写入)。
2.4 PROPAGATION_REQUIRES_NEW
- 行为:挂起当前事务(若存在),并创建新事务执行。
- 场景:独立业务操作(如记录日志不受主业务回滚影响)。
java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void auditLog(String action) {
// 独立事务执行
}
2.5 PROPAGATION_NOT_SUPPORTED
- 行为:以非事务方式执行,并挂起当前事务(若存在)。
- 场景:绕过事务(如调用外部非事务接口)。
2.6 PROPAGATION_NEVER
- 行为:必须在非事务环境下执行,否则抛出异常。
- 场景:禁止事务调用(如静态数据加载)。
2.7 PROPAGATION_NESTED
- 行为:如果当前存在事务,则在嵌套事务中执行(基于保存点回滚);否则新建事务。
- 场景:部分回滚需求(如订单子项校验失败时仅回滚子操作)。
java
@Transactional(propagation = Propagation.NESTED)
public void validateOrderItem(Item item) {
// 嵌套事务执行
}
3. 事务失效的常见陷阱
3.1 自调用问题
问题 :同一类中非事务方法调用 @Transactional 方法时,代理失效(AOP 基于代理)。
解决:通过注入自身代理类调用:
java
@Autowired
private OrderService selfProxy; // 通过 @EnableAspectJAutoProxy(exposeProxy=true) 暴露代理
public void placeOrder() {
selfProxy.processPayment(); // 通过代理调用事务方法
}
3.2 异常处理不当
问题 :默认回滚 RuntimeException,若捕获后未重新抛出,则事务不会回滚。
解决:显式配置回滚异常:
java
@Transactional(rollbackFor = {BusinessException.class, SQLException.class})
3.3 方法非 public
问题 :@Transactional 对非 public 方法无效(Spring AOP 限制)。
解决 :确保事务方法为 public。
4. 编程式事务控制
通过 TransactionTemplate 手动控制事务:
java
@Autowired
private TransactionTemplate transactionTemplate;
public void batchProcess() {
transactionTemplate.execute(status -> {
try {
// 业务逻辑
return null;
} catch (Exception e) {
status.setRollbackOnly(); // 标记回滚
throw e;
}
});
}
5. 最佳实践
- 精确配置传播行为 :避免滥用
REQUIRES_NEW(资源锁竞争风险)。 - 事务粒度最小化:减少长事务导致的数据库连接占用。
- 读写分离 :查询操作使用
readOnly = true提升性能。 - 监控事务超时:避免死锁或长时间阻塞:
java
@Transactional(timeout = 30) // 单位:秒
通过理解事务传播机制和规避常见陷阱,可显著提升分布式系统的事务一致性与性能。