关于 Laravel 数据库查询锁必须要知道的知识点

Mysql锁的类型

1 共享锁
* 查询数据 会阻塞 等待没有任何人占用的时候再返回
* 更新数据 会阻塞 等待没有任何人占用的时候再返回

DB::table('users')->where('id', 100)->lockForUpdate()->first();

2 悲观锁
* 查询数据 正常查询返回
* 更新数据 会阻塞 等待上一个锁更新执行完毕后再更新

DB::table('users')->where('id', 100)->sharedLock()->first();

如果我直接使用锁不使用事务能正常逻辑吗?

  • 正确
    DB::transaction(function() {
      $user = DB::table('users')->where('id', 100)->lockForUpdate()->first();
      $user->nick_name = "老王";
      $user->save();
    });
  • 错误
    $user = DB::table('users')->where('id', 100)->lockForUpdate()->first();
    $user->nick_name = "老王";
    $user->save();
  • 原因 锁必须要在事务中进行才能生效
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5

sharedLock才是共享锁吧,lockForUpdate是排他锁

4年前 评论
h6play (楼主) 4年前
QJAutumn 4年前
Alan_Alberto (作者) 4年前

写反了吧 lockForUpdate 是排它锁

4年前 评论

其实不放在事务里,锁还是生效的,因为mysql默认就是一次事务且自动提交

4年前 评论

怎么判断是否加锁了呢?

3年前 评论

两个接口同时查询数据,前面接口没查询完毕,后面接口就会被阻塞。请问如何去掉这种查询阻塞

3年前 评论
h6play (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!