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;
-
}
