下面是小凰凰的简介,看下吧! 💗人生态度:珍惜时间,渴望学习,热爱音乐,把握命运,享受生活 💗学习技能:网络 -> 云计算运维 -> python全栈( 当前正在学习中) 💗您的点赞、收藏、关注是对博主创作的最大鼓励,在此谢过! 有相关技能问题可以写在下方评论区,我们一起学习,一起进步。 后期会不断更新python全栈学习笔记,秉着质量博文为原则,写好每一篇博文。
Myisam一般采用表锁,它不支持行锁!
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
接下来分析读锁的特点! 我们先看,我开了两个session会话:
读锁肯定都能读的,主要验证写!
对自己的影响: 对其他人的影响:对于其他人是阻塞状态!当我们释放读锁,这边将会成功update!
阻塞的!
对他人的影响(写):阻塞的!
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。 MySQL的表级锁有两种模式:
表共享读锁(Table Read Lock) 表独占写锁(Table Write Lock) 锁类型自己可读自己可写他人可读他人可写读锁是否是否写锁是是否否结论, 结合上表,所以对MyISAM表进行操作,会有以下情况:
1. 对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。 2. 对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。简而言之,就是读锁会阻塞所有写,但是不会堵塞读。而写锁则会把读和写都堵塞,自己独占资源
innodb支持表锁,与更细粒度的行锁!innodb一般使用行锁。
在对一行或者说一个记录进行update、delete或者说insert时,会自动为行加写锁!select不会加锁,有需求需要自己加锁!
# select加读锁 select * from test_innodb_lock lock in share mode # select加写锁 select * from test_innodb_lock for update # 相当于就是给查询语句披了一个update语句的外衣和表锁的读锁一样,这个记录只能读,谁都不能对这个记录进行操作!
要想看到效果需要关闭autocommit,自动提交会自动释放写锁! 两个会话都需要做!现在我们就需要手动commit才能释放对行写锁!
现在我们执行update,实现行锁加写锁 加锁会话,数据已变更,另外一个会话没变更,因为加锁会话的数据修改没有提交嘛!现在只是在内存中修改了!现在a为4的记录应该处于加了写锁的状态,我们接下来看看其特性:
# 由上图可知,行加写锁,都可以读 由于加锁会话,读的是内存中已修改的数据,另一会话内存中没有,读的是硬盘中未修改数据,因此读的数据不一致 '注意:这里这个不是脏读,读取的是磁盘未修改的数据,这本来就是干净的数据!'我们接下来提交修改: 为什么还不变?因为innodb默认隔离级别为可重复读,因此它会重复读取上次的结果!我们上次读了次磁盘中未修改的数据嘛,这么说,我新开一个会话执行该命令,我是不是就能立马看到变化后的值,对!当然不新开会话,这个会话,你commit提交一下,也能马上看到效果!
首先行的写锁,加锁会话肯定写和读都可以,上面我们知道了其他会话也可以读!,其他会话的写是什么情况呢?
阻塞!
无论你是行锁(读或写锁)还是表锁(读或写锁),加锁的那个线程必须释放当前的锁,才能去找其他资源,不能吃到碗里,看着锅里的!
一个查询语句如果没有采用索引,那么它的type一定是all,全表扫描,因此这时行锁会升级成表锁!因此索引一定要好好优化,慎重创建!
先看下,不同行是否可以同时操作: 可以!
删除索引:
再次查看不同行是否可以操作: 不行了!因为升级成了表锁!
注意:即是你有索引,如果某种原因造成索引失效了,依然会锁定整张表! 比如索引字段id为varchar类型,你却where a = 1,那么也会造成索引失效!因此sql语句的优化、使用也要慎重!
注意:这里我在网上搜了好久,都没找到如何查看当前库下的行锁或表锁数量,也就是我无法直观得知到底这里是行锁还是表锁!如果有知道的小伙伴请评论区分享!感谢分享!
# 这里是搜的时候的一些命令 show status like 'innodb_row_lock%'; # 查看行锁信息 show status like 'Table_locks%'; # 查看表锁信息间隙锁带来的插入问题
什么叫间隙锁? 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”, InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(GAP Lock)。
间隙锁带来的危害? 因为Query执行过程中通过过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。 间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害
Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量较高的时候,Innodb的整体性能和MyISAM相比就会有比较明显的优势了。
但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MyISAM高,甚至可能会更差。
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。