悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一次吧。

悲观锁(Pessimistic Lock)

悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

乐观锁(Optimistic Lock)

乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。

乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳,然后按照如下方式实现:

1. SELECT data AS old_data, version AS old_version FROM …;
2. 根据获取的数据进行业务操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {// 乐观锁获取成功,操作完成
} else {// 乐观锁获取失败,回滚并重试
}

乐观锁是否在事务中其实都是无所谓的,其底层机制是这样:在数据库内部update同一行的时候是不允许并发的,即数据库每次执行一条update语句时会获取被update行的写锁,直到这一行被成功更新后才释放。因此在业务操作进行前获取需要锁的数据的当前版本号,然后实际更新数据时再次对比版本号确认与之前获取的相同,并更新版本号,即可确认这之间没有发生并发的修改。如果更新失败即可认为老版本的数据已经被并发修改掉而不存在了,此时认为获取锁失败,需要回滚整个业务操作并可根据需要重试整个过程。

总结

  • 乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能

  • 乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方

无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。不忘初心 方得始终!

谈谈mysql的悲观和乐观锁 - 周伯通的麦田 - 博客园相关推荐

  1. mysql悲观群_谈谈mysql的悲观和乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...

  2. c mysql datasource_DataSource(mysql/oracle) - 随笔分类 - 我爱si搬砖 - 博客园

    摘要:--单行函数:作用于一行,返回一个值--字符函数select upper(deptno),loc from dept;--结果转大写select lower(loc),loc from dept ...

  3. gradle mysql方言_2020 年 4月 随笔档案 - xj_aks - 博客园

    04 2020 档案 摘要:Maven 1. 什么是 Maven ? Maven 是Apache 基金下的个 Java 平台的项目自动化构建工具,基于 2. Maven 可以作什么 自动管理 jar ...

  4. mysql 类图_类图 - 吴小凯 - 博客园

    类图(Class Diagram): 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 类一般由三部分组成: 类名(Class):每个类都必须 ...

  5. mysql 时间拉链表_拉链表 - 夜半钟声到客船 - 博客园

    1.为什么要做拉链表 拉链表适用于同步新增和变化的数据!对于周期型事实表,采用同步新增和变化的方式! 使用场景: 1)比如订单状态: 三天内该订单状态发生了变化,但是同一个事物内进行的 2)人的出行轨 ...

  6. mysql左链表右链表区别_MySql链表语句--博客园老牛大讲堂

    为什么链表?--博客园老牛大讲堂 因为表与表之间有关系,而且查询时需要两张表的某些数据. 链表的前提是:表与表之间必须设置主外键吗? 不是的,其实表与表之间不需要设置主外键关系,用数据库语句就可以实现 ...

  7. mysql 浮动ip查找方法_浮动ip - CanntBelieve - 博客园

    浮动ip 其实就是动态ip, 静态IP是固定不变的,不管你用不用这个IP上网,这个IP都是属于你的 动态IP则是在使用的时候由DHCP服务器临时分配给你的,不用则不分配 在网络中如果设置了一部分静态I ...

  8. 详细分析MySQL的日志(一)本文原创地址:博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/9001061.html

    本文原创地址:博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/9001061.html 官方手册:https://dev.mysql.com/doc/refm ...

  9. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 - 左潇龙 - 博客园...

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  10. Redis分布式锁的正确实现方式(转发来至博客园Ruthless )

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

最新文章

  1. 国际顶级学术会议CIKM2019北京开幕在即,重量级嘉宾带你窥探人工智能前沿
  2. 使用css3进行增强
  3. 2020移动apn接入点哪个快_手机推荐:为什么别人的手机4G网总是比你快?这样设置一下,网速立马飙升...
  4. 当我们年轻的时候 (转贴)
  5. 鸿蒙系统首批更新名单,鸿蒙系统首批升级名单是哪些-鸿蒙系统首批升级名单详细介绍 - 系统家园...
  6. 第15届Pwn2Own大赛确定目标和奖金
  7. clion opencv安装_Mac 下搭建 Clion + OpenCV4.x 的开发环境
  8. python归并排序算法实现_排序算法之归并排序(附 Python 与 JS 实现)
  9. 交换机芯片笔记2.1
  10. 移动通信USSD业务探讨(转)
  11. 计算机语言中的计数器是什么,程序计数器的作用_程序计数器pc中存放的是什么...
  12. NC工具的使用说明教程
  13. 举个栗子~ Minitab 技巧(1):快速安装和激活 Minitab 统计软件
  14. 中国文学通史之各个阶段介绍
  15. GEE学习笔记(基础篇)更新中
  16. 商家招牌的分类与检测
  17. android实现首页倒计时,Android倒计时 Android仿京东倒计时 android电商app源码倒计时源码...
  18. DSOX2022A示波器的使用
  19. 无限度修正的随机块模型(2014)
  20. python语言程序设计 嵩天老师(第七周)

热门文章

  1. 计算机访问小米摄像机,小米摄像头连接教程
  2. Xshell脚本学习
  3. 2022-2028年中国中频加热设备行业市场发展调研及未来前景规划报告
  4. 教你撸一个网页聊天室
  5. 用.NET设计一个假装黑客的屏幕保护程序
  6. STEAM 教育相关书籍
  7. 唯品会 Dragonfly 日志系统的 Elasticsearch 实践
  8. kali火狐浏览器设置中文
  9. 微信支付服务器sdk升级,微信支付接口上手指引附微信SDK更新说明.PDF
  10. Windows 10微软拼音中添加自定义短语