30丨锁:悲观锁和乐观锁是什么?
陈旸
该思维导图由 AI 生成,仅供参考
索引和锁是数据库中的两个核心知识点,不论在工作中,还是在面试中,我们都会经常跟它们打交道。之前我们已经从不同维度对索引进行了了解,比如 B+ 树、Hash 索引、页结构、缓冲池和索引原则等,了解它们的工作原理可以加深我们对索引的理解。同时在基础篇的部分中,我也讲解了事务的 4 大原则以及不同的隔离级别。这些隔离级别的实现都是通过锁来完成的,你可以思考下为什么我们需要给数据加锁呢?
实际上加锁是为了保证数据的一致性,这个思想在程序开发领域中同样很重要。在程序开发中也会存在多线程同步的问题。当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在进行访问,保证数据的完整性和一致性。
今天的内容主要包括以下几个方面:
就分类而言,锁的划分有多种方式,这些划分方式都包括哪些?
为什么共享锁会发生死锁?
乐观锁和悲观锁的思想是什么?乐观锁有两种实现方式,这两种实现方式是什么?
多个事务并发,发生死锁时该如何解决?怎样降低死锁发生的概率?
按照锁粒度进行划分
锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁、页锁和表锁。
顾名思义,行锁就是按照行的粒度对数据进行锁定。锁定力度小,发生锁冲突概率低,可以实现的并发度高,但是对于锁的开销比较大,加锁会比较慢,容易出现死锁情况。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了数据库中的锁的分类和应用。首先,从锁的粒度和数据库管理的角度对锁进行了划分,包括行锁、页锁、表锁、共享锁和排它锁的概念及使用方式。文章还讨论了共享锁可能导致死锁的情况,以及乐观锁和悲观锁的思想。乐观锁通过版本号机制或时间戳机制实现,而悲观锁则通过数据库自身的锁机制来保证数据操作的排它性。从中可以看出乐观锁适合读操作多的场景,而悲观锁适合写操作多的场景。此外,文章还提到了避免死锁的方法,如一次锁定所有资源、锁升级和约定访问表的顺序等。最后,文章引发思考,为什么在使用MySQL InnoDB存储引擎时,对某行数据添加排它锁之前,会在数据表上添加意向排他锁。整体而言,本文内容丰富,对于理解数据库并发控制有很好的帮助。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》,新⼈⾸单¥68
《SQL 必知必会》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(44)
- 最新
- 精选
- melon老师 意向锁(intent lock)和间隙锁(gap lock) 还有next-key lock 能否说一下呢
作者回复: 感谢提问,在InnoDB中有三种行锁的方式: 1)记录锁:针对单个行记录添加锁。 2)间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。 3)Next-Key锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁+记录锁,可以解决幻读的问题
2019-08-24420 - 程序员花卷悲观锁和乐观锁 从字面上来理解,那就是一个是悲观的,一个是乐观的,至于什么意思,作为中国人,这词语的意思你不会不懂! 悲观锁 比如说有一个人总是小心翼翼的,吃饭喝水要验毒,家里要装摄像头,走路都要左顾右盼,生怕别人害他,在数据库中也就是生怕别人操作它的数据,干什么之前都要先检查一遍(加锁操作),等我使用完了,我在开放。(这样的人生其实太累了,容易死锁) 乐观锁 有个人干什么都很放心自己,也放心别人,大大咧咧,,吃饭也不管有没有毒就吃,类似于这样的操作就叫做是乐观锁,总是认为别人不会操作他的数据,就去操作数据,在提交的时候,根据固定的信息去检查一下,一般就是version.这样的话,如果发现信息不对(别人谋害他),就不更新了(去医院治愈好了)
作者回复: 总结的不错
2019-12-2528 - 程序员花卷问题—— 告诉其他人这个数据页或数据表已经有人上过排它锁了,这样当其他人想要获取数据表排它锁的时候,只需要了解是否有人已经获取了这个数据表的意向排他锁即可。而不需要进行全表的扫描,节省时间,提高效率!
作者回复: 对的
2019-12-257 - 峻铭乐观锁让我想起了java里面的cas原理
作者回复: 对 乐观锁的一种实现
2019-09-2336 - ABC回来补课,8月学了一段时间,然后去忙其他的了,希望年内能学完这门课😀😀
作者回复: 加油ABC同学,可以先粗略浏览一遍,然后找文章中感兴趣的内容,有代码的地方 自己复现一遍
2019-11-1921 - 捞鱼的搬砖奇请问xmind可以提供下吗
作者回复: 可以的,地址:https://github.com/cystanford/SQL-XMind
2019-08-191 - 夜空中最亮的星我又回来了老师
作者回复: 棒棒哒!
2019-08-191 - 安静的boy有一点不明白,为什么MyISAM不存在死锁的情况?MyISAM一个事务一次获取全部的共享锁,另一个事务也获取全部的共享锁,然后再更新数据,这个时候不还是会发生死锁吗?
作者回复: myisam不是事务安全的
2019-08-193 - DZ意向锁是一种协作机制,用于表锁和行锁的共生场景。 意向锁表达的信息很明确:某事务打算获得某种行锁,或某事务已持有某种行锁。 这样一来,打算锁表的事务就能迅速获得足够的锁信息并决定下一步行动。 反之,如果没有意向锁机制,打算锁表的事务就必须遍历所有行的锁信息,才能获得足够的锁信息,这样实际上就形成了行锁对表锁的严重干扰。 如果表锁和行锁不共生,如MyISAM仅支持表锁,就不需要意向锁了。2019-08-19263
- wonderq_gk死锁那个演示有问题啊,死锁是互相等待,而你演示的只是单方等待,很正常啊,根本就不是死锁2019-08-29549
收起评论