前言
在异步系统中诸如支付系统,MQ会出现重复发消息,这时候如果不做任何处理,订单的状态是会出现重复变更或者从一个已成功的状态变为处理中
如何解决?
1.引入原始状态
代码如下(示例):实体映射中加入fromStatus,用于状态变更控制(数据库是没有fromStatus字段的,当然这里做继承处理,文章是一种简易的展示)
public class Order {
//别的字段忽略
//数据库状态字段
private String status;
//原始状态
private String fromStatus;
}
数据库映射:mapper中对fromStatus进行判断相当于一个行级别的锁
<update id="updateOrder" parameterType="Order>
update order
<set>
<if test="status != null" >
statu s= #{status,jdbcType=VERCHAR},
</if>
gmt_modified = NOW()