关于两个程序同时查询mysql一条数据处理完之后又写入的问题

_yg 发布于 2016/05/27 21:10
阅读 131
收藏 0

程序A 会查询用户金额拿到金额后作一些处理后把金额又写进mysql, 例如查询100,处理后用了50,那么写进的时候是50,

同时程序B也做同样的操作,这个时候就出问题了。这种情况怎么处理啊,商城有余额的一般都会有这个问题吧,他们是怎么处理的呢

加载中
0
lymos
lymos
我也想知道,帮顶
0
西南茂
西南茂
可以设置锁的吧。查询之前先申请,如果可以进行操作则对该数据上锁,操作之后再解锁。另外一个服务器得到资源后同样的步骤。
0
eechen
eechen
方式一: 使用 MySQL InnoDB 事务
$db->query('SET AUTOCOMMIT=0');
// SELECT FOR UPDATE是写操作,id为1024的用户(数据行)被事务锁定
$db->query('SELECT balance FROM user WHERE id=1024 FOR UPDATE');
// 然后判断用户余额不小于扣除金额,并更新
$db->query('UPDATE user SET balance=50 WHERE id=1024');
$db->query('COMMIT');
$db->query('SET AUTOCOMMIT=1');

方式二: 使用 CAS(Check And Set) 机制(不需要事务支持)
// 拿到id为1024的用户记录的版本号last_version
$db->query('SELECT balance,version FROM user WHERE id=1024');
// 版本号没有变化,更新才会成功
$db->query('UPDATE user SET balance=50,version=last_version+1
WHERE id=1024 AND version=last_version');
返回顶部
顶部