标签:查询 where stl mon 程序 declare cti com 并发
转载:http://costlend.com/2016/03/14/dispatch-pay-balance-keep-consistence/
不管是电商,还是O2O业务都会涉及到支付,而且多速情况下流量比较大,尤其是在做活动的时候。一般支付系统主要有充值,扣费,提现,转账等功能,那么在有些业务场景下,尤其是多并发的情况下,我们在做扣费业务操作时该怎样去保持账户余额的一致呢?
Java开发人员可能第一个想法就是在调用扣减的DAO的方法上加上一个synchronized关键字,这个解决办法在单节点应用部署是也许能生效管用,但是在我们实际的应用场景中,一般都是集群,多节点部署的应用,这个时候该如何解决呢?
我们有一张账户表tb_account
field | type | desc |
---|---|---|
uid | bigint | 用户id |
balance | decimal | 余额 |
update_time | datetime | 表数据更新时间 |
扣费之前,我们要先查询一下账户的余额是否足够抵扣,然后再做真正的减扣。
大致的过程如下:
1 create procedure proc_account_balance_dec ( in_money decimal(8,2), in_uid bigint, OUT status int ) 2 BEGIN 3 4 DECLARE from_account_balance decimal(8,2); 5 6 START TRANSACTION; 7 8 SELECT balance INTO from_account_balance FROM tb_account 9 WHERE uid = in_uid FOR UPDATE; 10 11 IF from_account_balance>=in_money THEN 12 UPDATE tb_account SET balance = balance - in_money , update_time = sysdate() 13 WHERE uid = in_uid; 14 COMMIT; 15 16 SET status=1; 17 ELSE 18 ROLLBACK; 19 SET status=0; 20 END IF;
标签:查询 where stl mon 程序 declare cti com 并发
原文地址:http://www.cnblogs.com/loeng/p/6533611.html