多并发时支付如何保持账户余额的一致性
2018-03-22 20:13
417 查看
转载地址: 多并发时支付如何保持账户余额的一致性?不管是电商,还是O2O业务都会涉及到支付,而且多速情况下流量比较大,尤其是在做活动的时候。一般支付系统主要有充值,扣费,提现,转账等功能,那么在有些业务场景下,尤其是多并发的情况下,我们在做扣费业务操作时该怎样去保持账户余额的一致呢?Java开发人员可能第一个想法就是在调用扣减的DAO的方法上加上一个synchronized关键字,这个解决办法在单节点应用部署是也许能生效管用,但是在我们实际的应用场景中,一般都是集群,多节点部署的应用,这个时候该如何解决呢?
我们有一张账户表tb_account
扣费之前,我们要先查询一下账户的余额是否足够抵扣,然后再做真正的减扣。
大致的过程如下:select balance from tb_account where uid=100;
程序判断balance的值是否足够抵扣。
update tb_account set balance = balance - 28.00, update_time = sysdate() where uid=100;
通常情况下,这种余额判断方法在高并发且不加锁的情况下是非常不可靠的。所以在做扣费操作时要考虑到并发扣费的情况,允许让其并发扣费,但是不应该允许账户余额为负数。转账的话也是一样,相当于先从一个账户扣费,再给另一个账户充值,都必须要在一个事务内完成。
可以使用一个存储过程来把这些步骤统一起来。下面的存储过程亲测可用。
我们有一张账户表tb_account
field | type | desc |
---|---|---|
uid | bigint | 用户id |
balance | decimal | 余额 |
update_time | datetime | 表数据更新时间 |
大致的过程如下:select balance from tb_account where uid=100;
程序判断balance的值是否足够抵扣。
update tb_account set balance = balance - 28.00, update_time = sysdate() where uid=100;
通常情况下,这种余额判断方法在高并发且不加锁的情况下是非常不可靠的。所以在做扣费操作时要考虑到并发扣费的情况,允许让其并发扣费,但是不应该允许账户余额为负数。转账的话也是一样,相当于先从一个账户扣费,再给另一个账户充值,都必须要在一个事务内完成。
可以使用一个存储过程来把这些步骤统一起来。下面的存储过程亲测可用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | create procedure proc_account_balance_dec ( in_money decimal(8,2), in_uid bigint, OUT status int ) BEGIN DECLARE from_account_balance decimal(8,2); START TRANSACTION; SELECT balance INTO from_account_balance FROM tb_account WHERE uid = in_uid FOR UPDATE; IF from_account_balance>=in_money THEN UPDATE tb_account SET balance = balance - in_money , update_time = sysdate() WHERE uid = in_uid; COMMIT; SET status=1; < a703 br />ELSE ROLLBACK; SET status=0; END IF; END; |
相关文章推荐
- 多并发时支付如何保持账户余额的一致性?
- 多并发时支付如何保持账户余额的一致性?
- Spring和Hibernate 下如何保持事务的一致性和并发控制。
- 高频热点账户如何解决高并发余额计数问题?
- 高并发下Redis如何保持数据一致性(避免读后写)
- NOSQL如何与关系数据库保持最终一致性
- 高并发下 余额判断后支付 出现余额为负
- 请教~~~如何保持在两个数据库(sql server 2000)之间,保持事务的一致性
- mycncart之账户余额支付方式
- 如何在异步处理提高并发的情况下保持100%可靠?
- [转]主从复制:如何保持读写一致性
- 如何用话费账户来做手机支付
- 高并发下如何保证数据的一致性
- Java中上传文件和表单数据提交如何保持数据的一致性?
- memcahced如何保持一致性
- 如何保持数据库和缓存的一致性
- 2016 PayPal商家账户界面 如何集成支付按钮
- 游标对应的表的数据删除时,如何保持游标与表数据的一致性
- 如何让navigationItem在整个项目保持一致性?
- mycncart之账户余额支付方式