TP5事务中添加行锁

要求:

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

 

上一篇:JDBC_03实现用户登录业务


下一篇:SpringMVC自定义参数解析器