数据的锁定分为两种,第一种叫作悲观锁,第二种叫作乐观锁。

1.悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。【数据锁定:数据将暂时不会得到修改】
2.乐观锁,认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息。让用户决定如何去做。

以下是实例
什么是悲观锁?意思就是比较悲观,相信其他人在自己的操作过程会修改数据,影响自己的操作,
所以查询的时候就加锁,然后自己更新数据完毕再释放锁。可以有效防止减库存冲突问题。
什么是乐观锁?意思就是比较积极乐观,相信自己操作的过程中,不会有其他的人来修改数据,所以查询时就不加锁,然后更新的时候判断一下数据是不是被改掉。
以下思路是在php+mysql程序中
悲观锁的业务流程(以商品表和SKU表减库存并进行其它操作为类):

事务开始

  1. 查询商品表、锁定表:for update
  2. 判断商品库存是否大于购买数据,
  3. 如果库存满足,减少商品表库存。(不满足就回滚事务了。)
  4. 减少商品SKU表库存
  5. 记录订单操作记录等

事务提交(事务提交时即释放锁)。

可见上面的流程中整个被锁的周期是比较长的。如果改为乐观锁呢:

事务开始

  1. 查询商品表
  2. 判断商品库存是否大于购买数据,
  3. 如果库存满足,减少商品表库存(条件是商品表的库存=1中查询出的库存)
  4. 减少商品SKU表库存(同样需要判断条件)
  5. 记录订单操作记录等

事务提交(事务提交时即释放锁)。

在上面的乐观锁的执行流程中,如果3、4、5这三步中的任何一步发生异常,都会因滚事务。这样就不会出现减库存冲突导致库存脏数据了。
两种锁各有各的好,建议电商网站起步时访问量不大,不会造成压力时使用悲观锁。因为这时没有什么高并发,但也要好好检查代码防止出现死锁。
对于成熟的电商网站,必须面对高并发的情况下,应该使用乐观锁。

php中的乐观锁和悲观锁相关推荐

  1. 数据库中的乐观锁与悲观锁详解

    目录 悲观锁 乐观锁 悲观锁实现方式 乐观锁实现方式 如何选择 悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发. 这种借 ...

  2. Java开发技巧——并发控制中的乐观锁与悲观锁

    1.为什么需要锁? 在多用户环境中,在同一时间可能会有多个用户新相同的记录,这会产生冲突.这就是的并发性问题. 2.典型的冲突类型: (1)丢失新:一个事务的新覆盖了其它事务的新结果,就是所谓的新丢失 ...

  3. 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

    文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...

  4. 浅谈面试中常提到的乐观锁与悲观锁

    首先来看一下什么是锁? 在并发环境下,会出现多个线程对同一个资源进行争抢的情况,假设A线程对资源正在进行修改,此时B线程此时又对资源进行了修改,这就可能会导致数据不一致的问题.为了解决这个问题,很多编 ...

  5. 并发控制中的乐观锁与悲观锁

    为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: (1)丢失更新:一个事务的更新覆盖了其它事务的更新结果,就 ...

  6. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

  7. 数据库中的乐观锁与悲观锁

    悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发. 这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发 ...

  8. 浅谈面试中的乐观锁与悲观锁

    乐观锁与悲观锁 一.什么是乐观锁(Optimistic Locking)? 二.什么是悲观锁(Pessimistic Lock)? 悲观锁主要分为共享锁和排他锁 注意 三.并发控制 一.什么是乐观锁( ...

  9. java中的锁---乐观锁与悲观锁的区别

    锁,是开发中不得不掌握的一个知识点. 在面试中也会经常问到.其中乐观锁与悲观锁为最常见.首先介绍下两种锁 一:乐观锁: 1 介绍: 它的心态很好,每次别人使用它的时候,它会乐观的认为别人不修改数据,所 ...

  10. 一文搞懂 mysql 中的共享锁、排他锁、悲观锁、乐观锁及使用场景

    目录 一.常见锁类型 二.Mysql引擎介绍 三.常用引擎间的区别 四.共享锁与排他锁 五.排他锁的实际应用 六.共享锁的实际应用 七.死锁的发生 八.另一种发生死锁的情景 九.死锁的解决方式 十.意 ...

最新文章

  1. Vue异步组件Demo
  2. linux版视频转换软件,居家旅行必备的Linux视频转换工具
  3. C/C++/VC++ 变量命名规则
  4. 传智Python视频_基础班+就业班
  5. spring 5.x(1)-----Spring Framework 5.x中的新功能
  6. 用GitHub Copilot 生成的项目中,40%会引入漏洞
  7. 全栈性能测试修炼宝典jmeter实战电子版_JMeter实战(一) 体系结构
  8. cleanmymac x激活码免费下载激活及使用教程
  9. 一步步破解app协议第二步(审计代码)
  10. 数学中 对数log 指数
  11. 解决布局点击事件穿透的问题
  12. linux 7 恢复系统,CentOS 7在grub rescue模式中修复系统
  13. 查手机服务器ip和端口网站,如何查询服务器ip地址和端口号
  14. 使用lombok时,get/set方法冒红问题
  15. 【Flutter小记4】Android手动设置Camera焦点没效果的解决方案CameraImage转YUV或RGBA要注意!
  16. linux 环境下安装dubbo管理控制台 dubbo admin
  17. 头条App项目测试实战(七)实名认证功能用例设计
  18. google浏览器字体模糊问题(类似分辨率问题)解决办法
  19. D. Rescue Nibel(cf) 区间覆盖 + 组合数学
  20. 系统集成项目管理工程师(软考中级)—— 第十七章 项目沟通和干系人管理 笔记分享

热门文章

  1. 网络编程中同步与异步,IO阻塞与非阻塞总结
  2. 手机上好用的APP推荐
  3. Ubuntu重启黑屏无法进入GUI桌面
  4. Python+OpenCV实现实时视频3D换脸
  5. 基于Java毕业设计房屋租赁平台源码+系统+mysql+lw文档+部署软件
  6. keil5 芯片包下载系列
  7. 将EXCEL表格的数据转化为数组对象形式的数据
  8. android实现全国公祭日灰白模式
  9. 傻瓜式操作更改微信步数
  10. 脊髓炎起病急 该做好哪些治疗呢?