thinkphp5使用数据库表锁
2023-03-29 23:03:03
1619
{{single.collect_count}}

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

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}