用户余额下单如何保证数据一致性 mysql垂直分库:用户余额一个库,订单表一个库,资金明细一个库。用户采用余额下单,余额后马上下单成功,怎么在大并发情况下保证不会被多下单(余额100却能下多单100元的)且数据一致。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你标题是事务性,但内容我看是跟锁有关的。直接update 表 set 余额 = 余额 - xx就可以了,不管你前端有多少用户同时请求,数据库表这里总有一个先后的(数据库内部也有锁),更新完之后读一下,如果其中某一笔交易的费用大于余额就报错并回滚。 看你想一致到什么程度,强一致就需要单独搭建一个事物协调服务,用两阶段三阶段提交,但是并发能力不高。只要达到最终一致就可以用mq事物,用rocketmq有现成的接口可用,其他mq需要自己维护本地消息表,记录失败的事物,定期回滚补偿。你说的是大并发,那就应该用mq事物。 tcc补偿型事务,预处理的时候冻结余额,下单成功后用冻结的记录把余额扣掉,把冻结记录清除,下单失败后把冻结记录清除。 redis 分布式锁,setNX() 用户维度的分布式锁, mysql 也能实现分布式锁。 请教大虾?问题在哪? (急)怎么从web服务器(Tomcat服务器)上下载指定的文件? SSH整合dwr出现问题, 急求解!关于序列化问题、在线等. <html:select 怎样保持下拉框里值 一个小问题,关于javascript,马上就给50分 Session Bean的生命周期问题? 新手求教tomcat池连数据库 請教高手Tomcat5下的頁麵編碼問題,無法正常顯示中文!救命啊 petstore怎么安装,怎么用啊? super() 感觉很多都没有意义但是为什么要这么写呢??~ 冒泡排序问题
直接update 表 set 余额 = 余额 - xx就可以了,不管你前端有多少用户同时请求,数据库表这里总有一个先后的(数据库内部也有锁),更新完之后读一下,如果其中某一笔交易的费用大于余额就报错并回滚。
只要达到最终一致就可以用mq事物,用rocketmq有现成的接口可用,其他mq需要自己维护本地消息表,记录失败的事物,定期回滚补偿。
你说的是大并发,那就应该用mq事物。