要求:
1 必须是InnoDB
2 必须在事务里边
MYSQL直接加行锁可以这样
事务开始
SELECT `money` FROM eet_test WHERE id=30 FOR UPDATE;
得到钱数,算出新钱数
UPDATE eet_test SET `money` =新钱数 WHERE id=30;
事务提交
如果放在TP里:
public function locktest(){
Db::startTrans();
$user_id = 100;
$userinfo = Db::table(‘fa_user‘)->lock(true)->where(‘id‘, $user_id)->find();//加锁
$money = isset($userinfo["money"]) ? floatval($userinfo["money"]) : 0;
$new_money = $money + 50;
Db::table(‘fa_user‘)->where([‘id‘ => $user_id])->update([‘money‘ => $new_money]);
Db::commit();
}
在TP里自动就提交了,想要测试看效果,可以在Db::commit();之前加个sleep(5) 然后用另一个MYSQL客户端,比如你可以用CMD命令行进入MYSQL 然后执行UPDATE `fa_user` SET money=1234 WHERE id=100; 可以看到效果,命令行一直在等待sleep5秒后才执行成功。
原文:https://www.cnblogs.com/yueool/p/15160702.html