铁律:事务里不做网络调用。远程接口的耗时不可控,会把数据库连接和行锁一起占住,高峰期足以把连接池拖死。
做法是把调用挪到事务外,先提交本地写库,再去调远程;远程失败走补偿,靠重试、状态标记加定时任务对账来兜底,而不是回滚整个事务。
确实需要联动的场景,也只在事务提交之后发消息,并要求消费侧做幂等。
// 差:远程调用被包在事务里,长事务
@Transactional
void create() { save(order); httpClient.notify(order); }
// 好:本地提交后再调用,失败标记重试
save(order);
txManager.commit();
try { httpClient.notify(order); }
catch (Exception e) { markRetry(order); }
THE END






暂无评论内容