赞
踩
幂等性需要唯一的业务订单号来保证,插入类接口
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来实现
情况一:并发+分库分表
这里就不光要考虑集群高并发了,还需要路由策略,将orderID经过hash保证每次落到同一个表中;比如Mycat配置路由算法函数
<schema name="lyz" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"></table>
</schema>
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。