背景
项目中存在「批量接口」和「增量接口」,两个接口都更新DB中的数据。
如存在以下表格,主键为shopId,shopName表示店名。
shopId
shopName
111
info111
222
info222
333
info333
有以下两个接口:
updateShopNameBatch(List shopIdList, String shopName);
updateShopName(Integer shopId, String shopName);
两个接口的功能分别为批量修改门店名称和单个修改门店名称。
忽略接口中的其他操作,主要执行了以下两句sql。
update Shop set shopName = #{shopName} where shopId in
#{shopId}
update Shop set shopName = #{shopName} where shopId = #{shopId}
两个sql可能会修改同个shopId的shopName属性,存在一定的并发问题。
从数据库层看,两个sql的执行过程完全隔离,即先到先执行。
从接口层面看,批量更新接口和增量更新接口的并发执行会遇到以下情况:
批量接口先于增量接口收到请求,然而由于批量接口中执行了一些额外操作,导致增量接口先执行sql。最终结果被批量接口覆盖。
接口调用发起方先调用批量接口,再调用增量接口,然而由于网络问题,增量请求先于批量请求到达服务提供方。