订单防重(幂等性)

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

情况一:并发+单表

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

		2.乐观锁
			只适合update类接口;
		sql如下
 
        update t_g7_test
        
         
            
                age=#{age,jdbcType=INTEGER},
            
            state=1
        
        where id=#{id} and state=0
    
		3.mysql唯一索引	
		4.利用redis的原子性实现分布式锁 将orderID作为key,setnx成功这进行insert/update,
		5.或者支付系统使用uuid-生成token响应给订单系统,并把token放在redis中,订单系统依据此token来实现

情况一:并发+分库分表

	这里就不光要考虑集群高并发了,还需要路由策略,将orderID经过hash保证每次落到同一个表中;比如Mycat配置路由算法函数
	
	
		
id rang-long

你可能感兴趣的:(中间件)