事务失效场景(4)
多线程调用与Spring事务机制
问题原因:
- Spring将事务状态存储在ThreadLocal变量中
- 新创建的线程无法访问父线程的ThreadLocal变量
- 导致子线程无法继承父线程的事务上下文
解决方案:
- 避免在事务方法中创建新线程
- 使用编程式事务管理
- 使用分布式事务框架(如Seata)
异常捕获与Spring事务回滚机制
问题原因:
- 当异常在方法内部被try-catch块捕获并处理时,Spring的事务拦截器无法感知到这个异常
解决方案:
- 在catch块中手动回滚事务
- 重新抛出异常
- 配置@Transactional注解的rollbackFor属性
@Transactional
public void someMethod() {
try {
// 业务代码
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
手动抛出异常错误
问题原因:
- Spring默认只对RuntimeException和Error进行事务回滚
解决方案:
- 配置rollbackFor规则
- 将检查异常包装为运行时异常抛出
@Transactional(rollbackFor = {IOException.class, SQLException.class})
public void businessMethod() throws IOException {
// 业务逻辑
}