要求:
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秒后才执行成功。