TCC协议
类似二阶段提交(tcc好处:无需锁定资源,在独立事务中锁定就行。二阶段:牺牲了可用性,强一致性)
- try
- confirm
- cancel
交易开始 : 生成交易ID xid
- 库存表。item_id,amount
- 库存流水表 xid,status,item_id,amount。
- 优惠券
- 优惠券流水表
- 交易表。id,status,item_id ;status:初始化,库存冻结成功,优惠券冻结成功
- states=初始化
- 扣减库存请求
- try阶段 update stock set amount = amount - 1 where iten_id = ? and amount>0 冻结了一个库存 insert 流水表
- state=冻结库存成功
- 扣优惠券
- update voucher set amount = amount - 1 where voucher =? and amount>0 冻结了一个优惠 insert 流水表
- state=成功
- 释放事物,
防止JAVA执行中断,定时任务机制,把中间状态,停留超过15分钟的,判断是继续执行还是回滚。