简单#
 DB::beginTransaction(); // 开启事务
 $good = \App\Models\Good::sharedLock()->first(); //共享锁 s锁 读锁 (名字真多...)
// $good = \App\Models\Good::lockForUpdate()->first(); //排他锁 x锁 写锁...
 DB::commit();  
事务与锁
用锁需要先开启事务,事务提交,会自动解锁。

实例说明
超卖

这个代码多人访问肯定会出现超卖的。

(如果这个代码用共享锁 不但不能解决问题,还会造成死锁)

测试
ab -n 6 -c 3 http://mask.ymindex.test/api/test

(978 出现多次,那么到 0 的时候,也会出现多次,导致超卖)

使用排他锁解决超卖

共享和排他
共享:我可以读 写 加锁 , 别人可以 读 加锁。
排他:只有我 才 可以 读 写 加锁 , 也就是说,必须要等我提交事务,其他的才可以操作。
行锁:锁只对一行生效,比如 id=1 的那行
表锁:锁对整个表都生效

死锁:互相依赖,比如:多个锁住同一 行 / 表 数据。

如: 两个共享锁
我要修改: 你告诉我你锁了,等我("我"指的是你)先修改完。
你要修改: 我也锁了,等我(指我)先修改完。
我要修改: 你告诉我你锁了,等我(指你)先修改完。
...... 一万年后

Laravel事务解决: DB::transaction(function () {}, 5);
5是死锁时重复执行的次数 (详见文档)
.....

排他问题
会影响访问,你想,在锁期间,别人连商品点击来都看不了 (要等释放锁)。

所以我选择 redis 的 lpop。

if(! Redis::LPOP('stock'))
return 库存不足;

————————————————
原文作者:lyxxxh
转自链接:https://learnku.com/articles/44383
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

如何在 Laravel 中使用锁相关推荐

  1. 如何在 Laravel 中 “规范” 的开发验证码发送功能

    需求场景 发送「验证码」或者「消息通知」,可发送到手机或邮箱中. 完成 首先,在 Laravel 中的规范就是使用 Laravel 的「消息通知」,这里基于场景为「验证码」.这个需求几乎所有软件系统都 ...

  2. 如何在Laravel 中对大文件进行加密?

    我将其称为 FileVault 包,您可以 GitHub 上查看它. 如果您想跳过本教程,可以直接转到 GitHub 存储库并开始使用此软件包. 该扩展包包括了详细的使用文档. 教程 在这个教程中,我 ...

  3. 简单的11步在Laravel中实现测试驱动开发

    测试驱动开发(英语:Test-driven development,缩写为TDD)是一种软件开发过程中的应用方法,由极限编程中倡导,以其倡导先写测试程序,然后编码实现其功能得名. 下文是我在Mediu ...

  4. mosquitto mysql_在laravel中使用Mosquitto-PHP

    题目描述 在laravel中使用Mosquitto-PHP,总是出现MosquittoClient找不到的错误 题目来源及自己的思路 我已经编译了mosquitto.so,并加入了php.ini, 并 ...

  5. php调用trait方法,PHP Laravel中的Trait使用方法

    Trait是一种在单继承语言(如PHP)中重用代码的机制.Trait旨在通过使开发人员能够在生活在不同类层次结构中的多个独立类中自由地重用方法集来减少单继承的某些限制.Traits和类组合的语义以降低 ...

  6. php怎么写确认密码,如何在Laravel 5中验证当前密码,新密码和新密码的确认? - php...

    我已经在UserController@getProfilePassword和UserController@postProfilePassword中创建了密码路由,视图和方法 目前,如果我填写new_p ...

  7. 如何在Windows 10 1709版本中保存锁屏壁纸

    如何在Windows 10 1709版本中保存锁屏壁纸 [日期:2018-03-25] 来源:Linux公社  作者:醉落红尘 [字体:大 中 小] 许多用户似乎对Windows 10 Fall Cr ...

  8. php 两个类 相互调用_如何在 PHP 和 Laravel 中使用 Traits

    事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承.这意味着一个类只能从另一个类中继承.例如,可能希望从几个不同的类继承方法,以防止代码重复.在 PHP 5.4 中 一个新的语言特性 ...

  9. 关于laravel中如何在where中使用in这回事

    原因 事情是这样的,新的项目中使用laravel作为开发框架,在使用查询构造器的时候就出现了这个问题.我在查询的时候需要使用 ,结果发现 下面这种使用方式是错误的,所以就花时间研究了一下. $wher ...

最新文章

  1. linux下top命令参数解释
  2. 如何找出nginx配置文件的所在位置?
  3. php base64安全吗,php base64
  4. mysql with as 用法_Python之图解with语句
  5. POST—GET—两种提交方式的区别
  6. extjs4.1单击treepanel节点收缩叶子节点
  7. 环境变量的配置导致无法登录
  8. foreman架构的引入3-安装Foreman1.5.3架构(all-in-one)
  9. SQL点点滴滴_常用函数
  10. javascript手册安卓版_javascript手册
  11. 醉逍遥显示无法更新服务器,蜀门醉逍遥版本修改教程 (值好几千,俺心血).doc
  12. 小程序源码:经典语录大全微信小程序下载多种分类语录
  13. ubuntu修改u盘权限_Ubuntu下的U盘只读文件系统,该图标已锁定,表明无法对其进行修改...
  14. 关于高版本web3j调用okhttp3.RequestBody.create(Ljava/lang/String;Lokhttp3/MediaType;)Lokhttp3/RequestBody异常
  15. Lisp语言:循环控制
  16. R markdown的笔记02
  17. eclipse安装c语言开发linux,在linux下安装eclipse 开发c语言程序
  18. linux如何解压.z文件,linux文件解压缩命令(史上最全教程)
  19. 软件工程期末复习笔记(文末有PDF版本)
  20. 西安80转2000坐标参数_ERDAS中自定义坐标系的方法(转自百度,仅供参考)

热门文章

  1. css 商城 两列_css大法之使用伪元素实现超实用的图标库(附源码
  2. CSDN、博客园等6大技术博客平台的写作体验测评 1
  3. VMware ESX 5.0 网卡负载均衡配置3种方法
  4. Boot目录下内容丢失导致系统无法启动
  5. 异常处理 Exception
  6. Centos:Yum常用参数
  7. 全面IT资源监控 构建新一代数字化校园——天津大学
  8. Vue2 模板template的四种写法总结
  9. php识别中文编码并自动转换为UTF-8
  10. Swift语法专题五——集合类型