mysql垂直分库:用户余额一个库,订单表一个库,资金明细一个库。
用户采用余额下单,余额后马上下单成功,怎么在大并发情况下保证不会被多下单(余额100却能下多单100元的)且数据一致。

解决方案 »

  1.   

    你标题是事务性,但内容我看是跟锁有关的。
    直接update 表 set 余额 = 余额 - xx就可以了,不管你前端有多少用户同时请求,数据库表这里总有一个先后的(数据库内部也有锁),更新完之后读一下,如果其中某一笔交易的费用大于余额就报错并回滚。
      

  2.   

    看你想一致到什么程度,强一致就需要单独搭建一个事物协调服务,用两阶段三阶段提交,但是并发能力不高。
    只要达到最终一致就可以用mq事物,用rocketmq有现成的接口可用,其他mq需要自己维护本地消息表,记录失败的事物,定期回滚补偿。
    你说的是大并发,那就应该用mq事物。
      

  3.   

    tcc补偿型事务,预处理的时候冻结余额,下单成功后用冻结的记录把余额扣掉,把冻结记录清除,下单失败后把冻结记录清除。
      

  4.   

    redis 分布式锁,setNX() 用户维度的分布式锁, mysql 也能实现分布式锁。