SQL 必知必会
陈旸
清华大学计算机博士
73338 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

30丨锁:悲观锁和乐观锁是什么?

时间戳机制
版本号机制
避免死锁的方法
悲观锁
乐观锁
排它锁
共享锁
数据库锁
区锁
表锁
页锁
行锁
总结
为什么共享锁会发生死锁的情况
从程序员的角度进行划分
从数据库管理的角度对锁进行划分
按照锁粒度进行划分
锁的划分

该思维导图由 AI 生成,仅供参考

索引和锁是数据库中的两个核心知识点,不论在工作中,还是在面试中,我们都会经常跟它们打交道。之前我们已经从不同维度对索引进行了了解,比如 B+ 树、Hash 索引、页结构、缓冲池和索引原则等,了解它们的工作原理可以加深我们对索引的理解。同时在基础篇的部分中,我也讲解了事务的 4 大原则以及不同的隔离级别。这些隔离级别的实现都是通过锁来完成的,你可以思考下为什么我们需要给数据加锁呢?
实际上加锁是为了保证数据的一致性,这个思想在程序开发领域中同样很重要。在程序开发中也会存在多线程同步的问题。当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在进行访问,保证数据的完整性和一致性。
今天的内容主要包括以下几个方面:
就分类而言,锁的划分有多种方式,这些划分方式都包括哪些?
为什么共享锁会发生死锁?
乐观锁和悲观锁的思想是什么?乐观锁有两种实现方式,这两种实现方式是什么?
多个事务并发,发生死锁时该如何解决?怎样降低死锁发生的概率?

按照锁粒度进行划分

锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁、页锁和表锁。
顾名思义,行锁就是按照行的粒度对数据进行锁定。锁定力度小,发生锁冲突概率低,可以实现的并发度高,但是对于锁的开销比较大,加锁会比较慢,容易出现死锁情况。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了数据库中的锁的分类和应用。首先,从锁的粒度和数据库管理的角度对锁进行了划分,包括行锁、页锁、表锁、共享锁和排它锁的概念及使用方式。文章还讨论了共享锁可能导致死锁的情况,以及乐观锁和悲观锁的思想。乐观锁通过版本号机制或时间戳机制实现,而悲观锁则通过数据库自身的锁机制来保证数据操作的排它性。从中可以看出乐观锁适合读操作多的场景,而悲观锁适合写操作多的场景。此外,文章还提到了避免死锁的方法,如一次锁定所有资源、锁升级和约定访问表的顺序等。最后,文章引发思考,为什么在使用MySQL InnoDB存储引擎时,对某行数据添加排它锁之前,会在数据表上添加意向排他锁。整体而言,本文内容丰富,对于理解数据库并发控制有很好的帮助。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(44)

  • 最新
  • 精选
  • melon
    老师 意向锁(intent lock)和间隙锁(gap lock) 还有next-key lock 能否说一下呢

    作者回复: 感谢提问,在InnoDB中有三种行锁的方式: 1)记录锁:针对单个行记录添加锁。 2)间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。 3)Next-Key锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁+记录锁,可以解决幻读的问题

    2019-08-24
    4
    20
  • 程序员花卷
    悲观锁和乐观锁 从字面上来理解,那就是一个是悲观的,一个是乐观的,至于什么意思,作为中国人,这词语的意思你不会不懂! 悲观锁 比如说有一个人总是小心翼翼的,吃饭喝水要验毒,家里要装摄像头,走路都要左顾右盼,生怕别人害他,在数据库中也就是生怕别人操作它的数据,干什么之前都要先检查一遍(加锁操作),等我使用完了,我在开放。(这样的人生其实太累了,容易死锁) 乐观锁 有个人干什么都很放心自己,也放心别人,大大咧咧,,吃饭也不管有没有毒就吃,类似于这样的操作就叫做是乐观锁,总是认为别人不会操作他的数据,就去操作数据,在提交的时候,根据固定的信息去检查一下,一般就是version.这样的话,如果发现信息不对(别人谋害他),就不更新了(去医院治愈好了)

    作者回复: 总结的不错

    2019-12-25
    2
    8
  • 程序员花卷
    问题—— 告诉其他人这个数据页或数据表已经有人上过排它锁了,这样当其他人想要获取数据表排它锁的时候,只需要了解是否有人已经获取了这个数据表的意向排他锁即可。而不需要进行全表的扫描,节省时间,提高效率!

    作者回复: 对的

    2019-12-25
    7
  • 峻铭
    乐观锁让我想起了java里面的cas原理

    作者回复: 对 乐观锁的一种实现

    2019-09-23
    3
    6
  • ABC
    回来补课,8月学了一段时间,然后去忙其他的了,希望年内能学完这门课😀😀

    作者回复: 加油ABC同学,可以先粗略浏览一遍,然后找文章中感兴趣的内容,有代码的地方 自己复现一遍

    2019-11-19
    2
    1
  • 捞鱼的搬砖奇
    请问xmind可以提供下吗

    作者回复: 可以的,地址:https://github.com/cystanford/SQL-XMind

    2019-08-19
    1
  • 夜空中最亮的星
    我又回来了老师

    作者回复: 棒棒哒!

    2019-08-19
    1
  • 安静的boy
    有一点不明白,为什么MyISAM不存在死锁的情况?MyISAM一个事务一次获取全部的共享锁,另一个事务也获取全部的共享锁,然后再更新数据,这个时候不还是会发生死锁吗?

    作者回复: myisam不是事务安全的

    2019-08-19
    3
  • DZ
    意向锁是一种协作机制,用于表锁和行锁的共生场景。 意向锁表达的信息很明确:某事务打算获得某种行锁,或某事务已持有某种行锁。 这样一来,打算锁表的事务就能迅速获得足够的锁信息并决定下一步行动。 反之,如果没有意向锁机制,打算锁表的事务就必须遍历所有行的锁信息,才能获得足够的锁信息,这样实际上就形成了行锁对表锁的严重干扰。 如果表锁和行锁不共生,如MyISAM仅支持表锁,就不需要意向锁了。
    2019-08-19
    2
    63
  • wonderq_gk
    死锁那个演示有问题啊,死锁是互相等待,而你演示的只是单方等待,很正常啊,根本就不是死锁
    2019-08-29
    5
    49
收起评论
显示
设置
留言
44
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部