幂等性需要唯一的业务订单号来保证,插入类接口
情况一:并发+单表
1.先select后insert——>再参数校验是否支付过——>在执行支付;
缺点:1多一次select,高并发下性能低;
2.由于是两个操作,不具备原子性,存在事务问题,需要加@Transaction
2.乐观锁
只适合update类接口;
sql如下
<update id="updateByLock" parameterType="com.example.demo.dal.domain.User">
update t_g7_test
<set>
<if test="age != null">
age=#{age,jdbcType=INTEGER},
</if>
state=1
</set>
where id=#{id} and state=0
</update>
3.mysql唯一索引
4.利用redis的原子性实现分布式锁 将orderID作为key,setnx成功这进行insert/update,
5.或者支付系统使用uuid-生成token响应给订单系统,并把token放在redis中,订单系统依据此token来实现
情况一:并发+分