tp5数据库锁的使用

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') 其他用户乐观锁,可读不可写

  1. public function payNotify($message)
  2. {
  3. $this->startTrans();
  4. try {
  5. $order = $this
  6. ->where('orderno', $message['out_trade_no'])
  7. ->lock(true)
  8. ->find();
  9. if (!$order || $order['status'] == 2) { // 如果订单不存在 或者 订单已经支付过了
  10. $this->rollback();
  11. return true;
  12. }
  13. $order->status = 2;
  14. $order->paytime = time();
  15. $order->save();
  16. $this->commit();
  17. }catch(\Exception $e){
  18. $this->rollback();
  19. }
  20. return true;
  21. }

 

posted @ 2021-04-14 10:32  Bashuslovakia  阅读(969)  评论(0编辑  收藏  举报