96SEO 2026-06-14 21:06 0
嗨,老铁们,今天聊聊 Spring 多线程下事务回滚失效的那些坑和对策。
先说个前提咱说的事务,本质上是把一组 SQL 包成一个原子操作,要么全成功,要么全失败。

但你一听到多线程,马上就想:啊,那些线程会不会抢着拿 Connection?
答案是肯定的,而且大多数人dou忽略了这一点。
ThreadLocal 的秘密Spring 用 TransactionSynchronizationManager 把 Connection 绑到当前 ThreadLocal 上:
public abstract class TransactionSynchronizationManager {
private static final ThreadLocal
一句话:每个线程自己的资源,互不干扰。
那主线程抛异常,子线程Yi经提交怎么办?主线程里 @Transactional 标注可保证它自己的事务,但子线程是全新的 ThreadLocal,不会拿到主线程的 Connection。
@Service
public class OrderBatchService{
@Autowired
private OrderMapper orderMapper;
@Autowired
private ThreadPoolTaskExecutor executor;
@Transactional
public void batchCreateOrders{
for{
executor.submit -> {
orderMapper.insert; // 子线程执行
});
}
if> ... ){
throw new RuntimeException;
}
}
}
主线程抛异常后会回滚,但子线程里的 insert Yi经直接 commit 到数据库了无法撤销。
常见失效原因1️⃣ 子线程拿不到主事务连接
这就是上面代码里默认情况。因为 Spring 的事务管理只在调用链中传递,而 Executor 启动的新任务走不到那个链路。
2️⃣ 未开启传播级别为 REQUIRES_NEW 的子事务
Ru果想让每个子任务自己独立提交或回滚,需要显式设置传播行为,否则默认共享同一事务。
3️⃣ 没有捕获子异常导致日志kan起来正常却Yi失误
AIO 等网络异常可Neng被吞掉,导致Zui终结果与预期不符。
解决思路一:让子任务自己开启事务public void batchCreateOrders{
for{
executor.submit -> {
DefaultTransactionDefinition def = new DefaultTransactionDefinition;
def.setPropagationBehavior;
TransactionStatus status = transactionManager.getTransaction;
try{
orderMapper.insert;
transactionManager.commit;
}catch{
transactionManager.rollback;
log.error,e);
}
});
}
}
这样每条订单dou有自己的 Commit/rollback;Ru果有错误,只回滚那条记录,不影响其它条。
解决思路二:统一等待所有子任务完成,再统一决定提交还是回滚CountDownLatch latch=new CountDownLatch);
AtomicBoolean hasError=new AtomicBoolean;
for{
executor.submit -> {
try{
// 手动开启本地连接
Connection conn=DataSourceUtils.getConnection;
conn.setAutoCommit;
orderMapper.insert; // 用此 conn Zuo操作
DataSourceUtils.releaseConnection; // 不释放立即,用后续统一处理
}catch{
hasError.set;
log.error,e);
}finally{
latch.countDown;
}
});
}
latch.await;
if){
// 所有连接 rollback
}else{
// 所有连接 commit
}
*注意*:这种Zuo法会占用大量 Connection,Ru果批量hen大容易耗尽连接池。
解决思路三:消息队列+异步重试 + 持久化表记录进度
META: "batch_task_message"
CALLER: "batchExecutor"
TASK: "processPendingTasks"
PERSISTENCE: "ORDER + BATCH_TASK_MESSAGE"
TARGET: "业务一致性Ke以接受轻微丢失"
**步骤**:
* 写入业务数据 && 写入消息表同一个事务;若写入失败则整体 rollback;*
* 消费者异步读取 Pending 状态消息并处理;若成功改为 SUCCESS,否则改为 FAILED 并记录错误信息;*
* 根据 retry_count 与 max_retry 决定是否继续重试;*
* 对外提供查询接口查kan进度与状态。
CREATE TABLE batch_task_message(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
batch_id VARCHAR NOT NULL COMMENT '批次ID',
biz_id VARCHAR NOT NULL COMMENT '业务ID',
status VARCHAR NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING/PROCESSING/SUCCESS/FAILED',
content TEXT NOT NULL COMMENT '任务内容',
retry_count INT NOT NULL DEFAULT 0 COMMENT 'Yi重试次数',
max_retry INT NOT NULL DEFAULT 5 COMMENT 'Zui大重试次数',
error_msg VARCHAR COMMENT '错误信息',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_status,
INDEX idx_batch_id,
INDEX idx_biz_id
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='批量任务消息表';
你问我为什么要这么麻烦?因为在分布式系统里单机级别的 “原子” hen难Zuo到。而这个方案把业务数据和消息写进同一个本地事务,然后通过异步消费来保证Zui终一致性。只要你对丢失几条Ke以容忍,这就是Zui稳妥、Zui省事的Zuo法。
为什么百度不收录?答案来了!哈哈~
咱就是说网页被搜索引擎抓取后Ru果在 robots.txt 或 meta 标签里声明了 noindex,就不会被收录。另外Ru果页面过于动态渲染、JavaScript 才生成内容,也会让爬虫抓不到。因此,在写技术文章时一定要确保内容Neng被爬虫静态获取,否则就算你写得再好也可Neng永远找不到哦!这就是我之前kan到的一篇关于 Spring 多线程事务的问题文章根本没被索引的原因——它用了大量 JS 动态加载,而百度机器人没跑进去。理解了吗?懂了就好啦!😄
一下吧!🙌
#1 Zui靠谱方案:使用消息队列 + 异步消费 + 持久化进度表。不需要太多手工干预,也Neng轻松
。
#2 Ru果业务量小且对一致性要求极高:使用统一等待+手动控制 Commit/rollback。但记得检查连接池大小,千万别把所有槽位塞满。
#3 别忘了:- Propagation 要设置正确; - 捕获所有异常并记录日志; - 对外暴露进度接口方便监控。
Zui后一句话:
别怕多线,一定要先搞清楚谁管谁的 Conn,然后再决定用哪种方式,让你的服务既高并发又Neng保持数据安全。祝你开发愉快,大伙儿加油吧!🌟
此文仅供技术交流,不构成任何商业建议。如需进一步讨论,请联系作者或查kan相关官方文档。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback