当前位置:   article > 正文

订单防重(幂等性)_幂等性和支付订单防重复

幂等性和支付订单防重复

幂等性需要唯一的业务订单号来保证,插入类接口

情况一:并发+单表

		1.先select后insert——>再参数校验是否支付过——>在执行支付;  
			 缺点:1多一次select,高并发下性能低;
			 			2.由于是两个操作,不具备原子性,存在事务问题,需要加@Transaction	 						

		2.乐观锁
			只适合update类接口;
		sql如下
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
 <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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
		3.mysql唯一索引	
		4.利用redis的原子性实现分布式锁 将orderID作为key,setnx成功这进行insert/update,
		5.或者支付系统使用uuid-生成token响应给订单系统,并把token放在redis中,订单系统依据此token来实现
  • 1
  • 2
  • 3

情况一:并发+分库分表

	这里就不光要考虑集群高并发了,还需要路由策略,将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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/234682
推荐阅读
相关标签
  

闽ICP备14008679号