springboot 思维导图,尚学堂 java300 集,从头到尾,都是精华
锁种类
Mysql 中锁的分类按照不同类型的划分可以分成不同的锁,按照**「锁的粒度」划分可以分成:「表锁、页锁、行锁」;按照「使用的方式」划分可以分为:「共享锁」和「排它锁」;按照思想的划分:「乐观锁」和「悲观锁」**。
下面我们对着这几种划分的锁进行详细的解说和介绍,在了解设计者设计锁的概念的同时,也能深入的理解设计者的设计思想。
**「表锁」**是粒度最大的锁,开销小,加锁快,不会出现死锁,但是由于粒度太大,因此造成锁的冲突几率大,并发性能低。
Mysql 中**「MyISAM 储存引擎就支持表锁」,MyISAM 的表锁模式有两种:「表共享读锁」和「表独占写锁」**。
当一个线程获取到 MyISAM 表的读锁的时候,会阻塞其他用户对该表的写操作,但是不会阻塞其它用户对该用户的读操作。
相反的,当一个线程获取到 MyISAM 表的写锁的时候,就会阻塞其它用户的读写操作对其它的线程具有排它性。
**「页锁」**的粒度是介于行锁和表锁之间的一种锁,因为页锁是在 BDB 中支持的一种锁机制,也很少没人提及和使用,所以这里制作概述,不做详解。
**「行锁」**是粒度最小的锁机制,行锁的加锁开销性能大,加锁慢,并且会出现死锁,但是行锁的锁冲突的几率低,并发性能高。
行锁是 InnoDB 默认的支持的锁机制,MyISAM 不支持行锁,这个也是 InnoDB 和 MyISAM 的区别之一。
行锁在使用的方式上可以划分为:「共享读锁(S 锁)「和」排它写锁(X 锁)」。
当一个事务对 Mysql 中的一条数据行加上了 S 锁,当前事务不能修改该行数据只能执行度操作,其他事务只能对该行数据加 S 锁不能加 X 锁。
若是一个事务对一行数据加了 X 锁,该事物能够对该行数据执行读和写操作,其它事务不能对该行数据加任何的锁,既不能读也不能写。
「悲观锁和乐观锁是在很多框架都存在的一种思想,不要狭义地认为它们是某一种框架的锁机制」。
数据库管理系统中为了控制并发,保证在多个事务执行时的数据一致性以及事务的隔离性,使用悲观锁和乐观锁来解决并发场景下的问题。
Mysql 中**「悲观锁的实现是基于 Mysql 自身的锁机制实现,而乐观锁需要程序员自己去实现的锁机制」,最常见的乐观锁实现就锁机制是「使用版本号实现」**。
乐观锁设计思想的在CAS
的运用也是比较经典,之前我写过一篇关于 CAS 的文章,大家感兴趣的可以参考这一篇[]。
从上面的介绍中说了每一种锁的概念,但是很难说哪一种锁就是最好的,锁没有最好的,只有哪种业务场景最适合哪种锁,具体业务具体分析。
下面我们就具体基于 Mysql 的存储引擎详细的分析每一种锁在存储引擎中的运用和实现。
MyISAM
MyISAM 中默认支持的表级锁有两种:「共享读锁」和「独占写锁」。表级锁在 MyISAM 和 InnoDB 的存储引擎中都支持,但是 InnoDB 默认支持的是行锁。
Mysql 中平时读写操作都是隐式的进行加锁和解锁操作,Mysql 已经自动帮我们实现加锁和解锁操作了,若是想要测试锁机制,我们就要显示的自己控制锁机制。
Mysql 中可以通过以下 sql 来显示的在事务中显式的进行加锁和解锁操作
总结
三个工作日收到了 offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题 LeetCode 中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题 LeetCode 中文版》总共有 15 个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有 23 个章节:
第二个是 Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
第三个是网络(给大家看一本我之前得到的《JAVA 核心知识整理》包括 30 个章节分类,这本 283 页的 JAVA 核心知识整理还是很不错的,一次性总结了 30 个分享的大知识点)
评论