【名词解释】

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于 write_condition 机制的其实都是提供的乐观锁。

【如何使用】

下面我们看下悲观锁和乐观锁在 Laravel 中的使用:

悲观锁使用

Laravel 查询构建器提供了一些方法帮助你在 select 语句中实现“悲观锁”。可以在查询中使用 sharedLock 方法从而在运行语句时带一把”共享锁“。共享锁可以避免被选择的行被修改直到事务提交:

DB::table(‘users‘)->where(‘votes‘, ‘>‘, 100)->sharedLock()->get();

上面这个查询等价于下面这条 SQL 语句:

select * from `users` where `votes` > ‘100‘ lock in share mode;

此外你还可以使用 lockForUpdate 方法。“for update”锁避免选择行被其它共享锁修改或删除:

DB::table(‘users‘)->where(‘votes‘, ‘>‘, 100)->lockForUpdate()->get();

上面这个查询等价于下面这条 SQL 语句:

select * from `users` where `votes` > ‘100‘ for update;

for update 与 lock in share mode 都是用于确保被选中的记录值不能被其它事务更新(上锁),两者的区别在于 lock in share mode 不会阻塞其它事务读取被锁定行记录的值,而 for update 会阻塞其他锁定性读对锁定行的读取(非锁定性读仍然可以读取这些记录,lock in share mode 和 for update 都是锁定性读)。

这么说比较抽象,我们举个计数器的例子:在一条语句中读取一个值,然后在另一条语句中更新这个值。使用 lock in share mode 的话可以允许两个事务读取相同的初始化值,所以执行两个事务之后最终计数器的值+1;而如果使用 for update 的话,会锁定第二个事务对记录值的读取直到第一个事务执行完成,这样计数器的最终结果就是+2了。

乐观锁使用

乐观锁,大多是基于数据版本 ( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。

读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

【使用总结】

两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行重试,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

原文:https://www.cnblogs.com/itsharehome/p/12293856.html

laravel mysql 悲观锁_Laravel中悲观锁 乐观锁的使用相关推荐

  1. 悲观锁和乐观锁_面试必备之乐观锁与悲观锁

    何谓悲观锁与乐观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人. 大家可以点 ...

  2. mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...

  3. mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...

  4. python乐观锁代码实现_Django的乐观锁与悲观锁实现

    1)     事务概念 一组mysql语句,要么执行,要么全不不执行. 2)  mysql事务隔离级别 Read Committed(读取提交内容) 如果是Django2.0以下的版本,需要去修改到这 ...

  5. java dom4j读写锁,java锁的深度化-重入锁,读写锁,乐观锁,悲观锁

    1.重入锁 目的:避免死锁的现象 锁作为并发共享数据,保证一致性的工具,在java平台有多种实现synchronized(重量级)和ReentrantLock(轻量级)等等,这些已经写好提供的锁为我们 ...

  6. 各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)

    互斥锁 当有一个线程要访问共享资源(临界资源)之前,会对线程访问的这段代码(临界区)进行加锁.如果在加锁之后没释放锁之前其他线程要对临界资源进行访问,则这些线程会被阻塞睡眠,直到解锁,如果解锁时有一个 ...

  7. mysql设置乐观锁_mysql数据库怎么设置乐观锁

    乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持当数据很重要, 回滚或重试一次需要很大的开销时,需要保证操作的ACID性质, 此时应该采用悲观锁而当数据对即时的一致性要求不高 ...

  8. mysql乐观锁 秒杀_使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法...

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...

  9. java公平索非公平锁_java中的非公平锁不怕有的线程一直得不到执行吗

    首先来看公平锁和非公平锁,我们默认使用的锁是非公平锁,只有当我们显示设置为公平锁的情况下,才会使用公平锁,下面我们简单看一下公平锁的源码,如果等待队列中没有节点在等待,则占有锁,如果已经存在等待节点, ...

  10. android系统旁边有一个锁,Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    本文实例讲述了Android中系统自带锁WalkLock与KeyguardLock用法.分享给大家供大家参考,具体如下: WalkLock - 顾名思义 唤醒锁 点亮屏幕用的 KeyguardLock ...

最新文章

  1. 不知道这 7 大 OpenCV 函数怎么向计算机视觉专家进阶?
  2. 怎样将英文html文件转换成中文乱码,解决html导出pdf中文乱码问题的正确姿势
  3. 利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序(上)
  4. SCU 3133(博弈)
  5. 只需几分钟跟小猫学前端(内含视频教程):nodejs基础之用express、ejs、mongdb建设简单的网站...
  6. python对浏览器的常用操作有哪些_Python Selenium中对象常用操作方法
  7. 展望Java的未来:空值类型
  8. java异常处理机制_Java的异常处理机制
  9. 高效实用Kafka-Kafka集群维护(分区平衡机制、kafka分区日志迁移)
  10. Facebook 实时聊天架构日均处理数十亿条消息!
  11. 如何获得学生版本的免费eviews9
  12. MYSQL 8.0 OCP
  13. ssr使用mysql数据库_MySQL数据库安装与配置详解
  14. Struts2拦截器Filter
  15. 【机器学习实战】决策树算法:预测隐形眼镜类型
  16. 个推消息推送SDK通知栏铃声功能解析及使用攻略
  17. tplink怎么进去_在TP-Link工作体验如何?
  18. 电脑蓝屏怎么解决0x0000007b,解决电脑蓝屏问题
  19. 高德地图实现的数据统计切换街景地图
  20. 为何老人与年轻人都更愿意选择OPPO?这些用户需求值得关注

热门文章

  1. 如何在小程序里面放入企业官网
  2. (转)如何入门 Python 爬虫
  3. Java 实现奇数阶幻方的构造
  4. linux opencv install
  5. 绝对郁闷到死的NHibernate2.0。。。
  6. Python控制Photoshop(Python+Com)
  7. php替换字符串字符,php替换字符串中间字符为省略号的方法
  8. IDEA maven库里 添加自定义jar包
  9. 【Hoxton.SR1版本】Spring Cloud Gateway之Filter详解
  10. SpringBoot项目进行单元测试