php中的乐观锁和悲观锁
数据的锁定分为两种,第一种叫作悲观锁,第二种叫作乐观锁。
1.悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。【数据锁定:数据将暂时不会得到修改】
2.乐观锁,认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息。让用户决定如何去做。
以下是实例
什么是悲观锁?意思就是比较悲观,相信其他人在自己的操作过程会修改数据,影响自己的操作,
所以查询的时候就加锁,然后自己更新数据完毕再释放锁。可以有效防止减库存冲突问题。
什么是乐观锁?意思就是比较积极乐观,相信自己操作的过程中,不会有其他的人来修改数据,所以查询时就不加锁,然后更新的时候判断一下数据是不是被改掉。
以下思路是在php+mysql程序中
悲观锁的业务流程(以商品表和SKU表减库存并进行其它操作为类):
事务开始
- 查询商品表、锁定表:for update
- 判断商品库存是否大于购买数据,
- 如果库存满足,减少商品表库存。(不满足就回滚事务了。)
- 减少商品SKU表库存
- 记录订单操作记录等
事务提交(事务提交时即释放锁)。
可见上面的流程中整个被锁的周期是比较长的。如果改为乐观锁呢:
事务开始
- 查询商品表
- 判断商品库存是否大于购买数据,
- 如果库存满足,减少商品表库存(条件是商品表的库存=1中查询出的库存)
- 减少商品SKU表库存(同样需要判断条件)
- 记录订单操作记录等
事务提交(事务提交时即释放锁)。
在上面的乐观锁的执行流程中,如果3、4、5这三步中的任何一步发生异常,都会因滚事务。这样就不会出现减库存冲突导致库存脏数据了。
两种锁各有各的好,建议电商网站起步时访问量不大,不会造成压力时使用悲观锁。因为这时没有什么高并发,但也要好好检查代码防止出现死锁。
对于成熟的电商网站,必须面对高并发的情况下,应该使用乐观锁。
php中的乐观锁和悲观锁相关推荐
- 数据库中的乐观锁与悲观锁详解
目录 悲观锁 乐观锁 悲观锁实现方式 乐观锁实现方式 如何选择 悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发. 这种借 ...
- Java开发技巧——并发控制中的乐观锁与悲观锁
1.为什么需要锁? 在多用户环境中,在同一时间可能会有多个用户新相同的记录,这会产生冲突.这就是的并发性问题. 2.典型的冲突类型: (1)丢失新:一个事务的新覆盖了其它事务的新结果,就是所谓的新丢失 ...
- 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁
文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...
- 浅谈面试中常提到的乐观锁与悲观锁
首先来看一下什么是锁? 在并发环境下,会出现多个线程对同一个资源进行争抢的情况,假设A线程对资源正在进行修改,此时B线程此时又对资源进行了修改,这就可能会导致数据不一致的问题.为了解决这个问题,很多编 ...
- 并发控制中的乐观锁与悲观锁
为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: (1)丢失更新:一个事务的更新覆盖了其它事务的更新结果,就 ...
- java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)
Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...
- 数据库中的乐观锁与悲观锁
悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发. 这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发 ...
- 浅谈面试中的乐观锁与悲观锁
乐观锁与悲观锁 一.什么是乐观锁(Optimistic Locking)? 二.什么是悲观锁(Pessimistic Lock)? 悲观锁主要分为共享锁和排他锁 注意 三.并发控制 一.什么是乐观锁( ...
- java中的锁---乐观锁与悲观锁的区别
锁,是开发中不得不掌握的一个知识点. 在面试中也会经常问到.其中乐观锁与悲观锁为最常见.首先介绍下两种锁 一:乐观锁: 1 介绍: 它的心态很好,每次别人使用它的时候,它会乐观的认为别人不修改数据,所 ...
- 一文搞懂 mysql 中的共享锁、排他锁、悲观锁、乐观锁及使用场景
目录 一.常见锁类型 二.Mysql引擎介绍 三.常用引擎间的区别 四.共享锁与排他锁 五.排他锁的实际应用 六.共享锁的实际应用 七.死锁的发生 八.另一种发生死锁的情景 九.死锁的解决方式 十.意 ...
最新文章
- Vue异步组件Demo
- linux版视频转换软件,居家旅行必备的Linux视频转换工具
- C/C++/VC++ 变量命名规则
- 传智Python视频_基础班+就业班
- spring 5.x(1)-----Spring Framework 5.x中的新功能
- 用GitHub Copilot 生成的项目中,40%会引入漏洞
- 全栈性能测试修炼宝典jmeter实战电子版_JMeter实战(一) 体系结构
- cleanmymac x激活码免费下载激活及使用教程
- 一步步破解app协议第二步(审计代码)
- 数学中 对数log 指数
- 解决布局点击事件穿透的问题
- linux 7 恢复系统,CentOS 7在grub rescue模式中修复系统
- 查手机服务器ip和端口网站,如何查询服务器ip地址和端口号
- 使用lombok时,get/set方法冒红问题
- 【Flutter小记4】Android手动设置Camera焦点没效果的解决方案CameraImage转YUV或RGBA要注意!
- linux 环境下安装dubbo管理控制台 dubbo admin
- 头条App项目测试实战(七)实名认证功能用例设计
- google浏览器字体模糊问题(类似分辨率问题)解决办法
- D. Rescue Nibel(cf) 区间覆盖 + 组合数学
- 系统集成项目管理工程师(软考中级)—— 第十七章 项目沟通和干系人管理 笔记分享