前言
在MySQL中,锁这个定义其实还是蛮重要的。经过我这几天的学习,我感觉锁是一个可以说难又可以说不难的知识点。难就难在锁可以与事务、多线程、并发结合在一起,这就很难了。但是,假如锁没有结合这些知识点,就单单一个锁的知识,我个人觉得不算太难,而且关于锁的知识也就是那么几个:有哪几种锁?每种锁有什么用?每种锁的一些使用场景?诸如此类的问题。太难的知识掌握不了也没多大关系,但是像这种最基本的掌握不了,那就有点说不过去了。
我先把我对锁的脑图放出来,然后我根据我的脑图来讲:
全局锁
全局锁就是对整个数据库进行加锁,一般用于对数据库进行备份
表级锁
其实表级锁并不常用,一般只有存储引擎不支持行锁才会用表级锁。
表锁
如果一个线程对一张表设置了只读状态,那另一个线程对这张表只能读不能写;
如果一个线程对一张表设置了只写状态,那另一个线程对这张表既不能读也不能写。
元数据锁(MDL)
这个一般访问表的时候就会自动加上
行锁
行锁,听名字就知道它是对行进行加锁。一般在多个线程对同一行数据访问时会加这个锁,目的是防止多线程的并发问题。
间隙锁
间隙锁就是在行与行的间隙加锁。这个一般用于幻读。
幻读可以好好讲讲。幻读就是一个事务对一个范围内的数据进行连续两次的读操作,但是在这个读操作的间隙,另一个事务在这个范围内插入了一条数据,导致这个事务前后两次读操作的结果不一样,好像出现了幻觉一样。幻读的解决办法就是在行与行之间加上间隙锁,防止在读过程中插入数据。
心得体会
这篇文章知识点好像很多,很琐碎,什么全局锁,表级锁,表锁,元数据锁,行锁,幻读。但是我感觉只要你的脑子里有这么一个框架,那其实相对来讲会比较好记忆。而且你看名字就知道这些锁是什么意思了。