目录

悲观锁

乐观锁

对比与选择


在并发的环境下,需要用乐观锁和悲观锁来控制数据的准确性。

最终库存数量为4,但其实要是3才对,这就是并发环境下,没有做好并发控制的情况。

悲观锁

为了避免数据被同时修改,对一条数据进行修改前进行上锁,直到自己修改完,提交事务,才释放锁。这有点类似Java中的同步机制,对修改共享数据的代码进行同步,同一时间只能一个人修改来保证数据的准确性。

这种总是假设最坏的情况,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起,这种具有强烈的排他性,比较霸道的称为悲观锁。

实现方案:通过使用select...for update语句, 执行该语句后,会在表上加持行锁,一直到事务提交,解除行锁。

//0.开始事务
begin;

//1.查询出商品信息
select stockCount from seckill_good where id=1 for update;

//2.修改商品stockCount减一
update seckill_good set stockCount=stockCount-1 where id=1;

//3.提交事务
commit;

在对id = 1的记录修改前,先通过for update的方式进行加锁,然后再进行修改。

同一时间只有一个线程可以开启事务并获得id=1的锁,其它的事务必须等本次事务提交之后才能执行。

注意:

使用select_for_update,另外一定要写在事务中,加锁要么全执行,要么全不执行。

要使用悲观锁,必须关闭mysql数据库中自动提交的属性,命令set autocommit=0

乐观锁

乐观锁是相对悲观锁而言的,他不会加锁,是在数据进行提交更新的时候进行检测冲突,如果没有冲突,则正常更新数据,有冲突就看程序员如何处理,看是否回滚等。

主要实现方案:版本号+条件查询、CAS

版本号+条件查询

//1.查询出要下单商品的信息        
select stockCount, version from good where id=1;           

//2.修改要下单商品的库存数量
update good set stockCount=stockCount-1, version = version+1 where id=1, version=version

id为1,version为3,stockCount为5

同一时刻,一个用户成功修改库存为4,version为4;其他用户还是拿着id为1,version为3的条件取更新库存数量就不能更新成功了。这时可以让其他失败的用户重新下单,就会拿着id为1,version为4的条件更新库存数量为3。。。美好的结果

这样就算有多个用户同时下单同一个商品,在同一时刻,也只有一个能成功修改。

对比与选择

乐观锁的方式,在高并发时,只有一个线程能执行成功,会造成大量的失败,这给用户的体验显然是很不好的。并发冲突(冲突是指两个请求同时需要修改共享数据)少时可以用。

乐观锁没有加锁,效率是高的。

乐观锁如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户从新操作。悲观锁则会等待前一个更新完成再执行下一个更新。这也是区别。

响应效率:如果需要非常高的响应速度,建议采用乐观锁方案,成功就执行,不成功就失败,不需要等待其他并发去释放锁。乐观锁并未真正加锁,效率高。一旦锁的粒度掌握不好,更新失败的概率就会比较高,容易发生业务失败。

冲突频率:如果冲突频率非常高(就是写多),建议采用悲观锁,保证成功率。冲突频率大,选择乐观锁会需要多次重试才能成功,代价比较大。

重试代价:如果重试代价大,建议采用悲观锁。悲观锁依赖数据库锁,效率低。更新失败的概率比较低。

读写次数:读请求多使用乐观锁,写操作多使用悲观锁。

数据库的乐观锁和悲观锁相关推荐

  1. 【转】数据库的乐观锁和悲观锁

    [转]数据库的乐观锁和悲观锁 有时候为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定.所以说,悲观锁和乐观锁主要是用来 ...

  2. 数据库并发控制,选择乐观锁还是悲观锁?

    出处:http://www.cnblogs.com/chenlulouis/  今天,在这里,我们将讨论的是在实际生产过程中,对于并发控制你是选择乐观锁还是悲观锁.这两种锁各自的应用环境应该怎样选择? ...

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

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

  4. 程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

    菜菜哥,告诉你一个消息 你有男票啦? 非也非也,我昨天出去偷偷面试,结果又挂了 哦,看来公司是真的不想让你走呀 面试官让我说一下乐观锁和悲观锁,我没回答上来,回来之后我查了,数据库没有这两种锁呀 了解 ...

  5. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  6. 程序员过关斩将——数据库的乐观锁和悲观锁并非真实的锁

    作者 | 菜菜 责编 | 刘静 YY妹:菜菜哥,告诉你一个消息 菜菜:你有男票啦? YY妹:非也非也,我昨天出去偷偷面试,结果又挂了 菜菜:哦,看来公司是真的不想让你走呀 YY妹:面试官让我说一下乐观 ...

  7. oracle数据库字段的值加一_天天面试--数据库乐观锁和悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.悲观锁:假 ...

  8. 乐观锁 与 悲观锁 来解决数据库并发问题

    乐观锁 与 悲观锁 来解决数据库并发问题 参考文章: (1)乐观锁 与 悲观锁 来解决数据库并发问题 (2)https://www.cnblogs.com/xudong-bupt/p/8614997. ...

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

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

  10. 浅谈实现数据库乐观锁和悲观锁

    目录 数据库乐观锁 适用场景 定义 实现方式 优点与缺点分析 优点 缺点 案例 数据库悲观锁 适用场景 定义 实现方式 悲观锁优缺点分析 优点 缺点 在单实例JVM中,常见的处理并发问题的方法有很多, ...

最新文章

  1. LeetCode Hot100 ---- 链表专题专题
  2. REST framework 权限管理源码分析
  3. java算法概述,Java数据结构与算法基础(一)概述与线性结构
  4. python如何爬取sci论文中所需的数据_sci论文中的科研数据处理方法
  5. 时间加密算法_物联网安全:可计算加密算法
  6. Redis基础(九)——发布与订阅
  7. osharp3使用经验:整合DbContextScope 文章 1
  8. ERROR: Could not find a version that satisfies the requirement PIL (from versions: none)
  9. python模块导入及属性:import
  10. C# json解析字符串总是多出双引号_SSM框架中JSON数据交互实现页面显示图书种类...
  11. 自媒体时事热点类素材哪里找?推荐这3个网站
  12. PPT资源、技巧与设计网站精选【转自paratop】
  13. bootstrap开发微信公众号后台界面
  14. 利用Python提取PDF文件中的文本信息
  15. MATLAB 查找互素(质)对
  16. ANDROID XML图像资源文件详细讲解(一)
  17. 斯坦福I2V:一个用于以图搜视频的新闻视频数据集
  18. 文件目录自动生成工具--Dir Tree Noter
  19. 身份证件识别接口编写的JAVA调用示例
  20. 《听听那冷雨》感受余光中的唯美与浪漫

热门文章

  1. SM3-python3版
  2. python string转date类型_python转换字符串为datetime类型
  3. 2022年长沙二级建造师建设工程承包法律制度复习题及答案
  4. 深信服李新:企业数字化转型一定是“一把手”工程 | 2020全球数字价值峰会
  5. 来自男装的“制服诱惑”,这波设计够酷
  6. 华中科技大学陈琼计算机学院,闵林-计算机与信息工程学院官网
  7. 【UEFI实战】FSP简介
  8. 论文《Patchmatch-Based Robust Stereo Matching Patchmatch-Based Robust Stereo Matching》学习
  9. 腾讯云建站CloudPages模板搭建网站全解析
  10. 初步认识 Stripe 支付