tp5数据库锁的使用
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;
-
}