本文内容来源于一个实际问题,通过问题得到宝贵的经验,不仅是编码经验,更是设计经验。如下图所示,数据库修改(例如状态改为支付中)与调用三方服务处于同一个事务中,正常情况下三方接口几秒后即返回,数据库连接没有超时,流程不会出现问题。
极端问题出现了!
得到三方服务结果后,需要提交事务,但是由于数据库某些原因,导致db连接超时,最终提交失败。该情况的结果为:数据库修改失败,但是三方服务调用成功了,后续再次处理数据,导致重复调用三方服务。
解决方案1:
数据库修改与三方服务调用不要放在同一个事务中。
解决方案2:
如果有唯一性标识,数据修改和三方服务调用可以放在一个事务中,事前查询三方接口接口,再决定后续流程。
我个人观点,biz中组织业务流程,service中只做数据处理,保证service方法高内聚,所以增加数据中间状态,然后数据库修改和三方服务分开比较好。