thinkphp5使用数据库表锁

admin
2021-05-08
82

thinkphp5

数据库表锁

Lock方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:


Db::name('user')->where('id',1)->lock(true)->find();

就会自动在生成的SQL语句最后加上 FOR UPDATE或者FOR UPDATE NOWAIT(Oracle数据库)。


lock方法支持传入字符串用于一些特殊的锁定要求,例如:


Db::name('user')->where('id',1)->lock('lock in share mode')->find();

示例 


支付回调时锁定当前订单


lock(true)为悲观锁,加锁后,其他用户不能读也不能写


lock('lock in share mode') 其他用户乐观锁,可读不可写


    public function payNotify($message)

    {

        $this->startTrans();//开启事务

        try {

            $order = $this

                ->where('orderno', $message['out_trade_no'])

                ->lock(true)

                ->find();//加锁

            if (!$order || $order['status'] == 2) { // 如果订单不存在 或者 订单已经支付过了

                $this->rollback();

                return true;

            }

            $order->status = 2;

            $order->paytime = time();

            $order->save();

            $this->commit();//事务提交

        }catch(\Exception $e){

            $this->rollback();

        }

        return true;

    }