《深入浅出MySQL》读书笔记六:锁问题

一、概述

MySQL不同的存储引擎支持不同的锁机制。MyISAM采用表级锁,InnoDB支持 表级锁和行级锁。

表级锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定力度最小,发生锁冲突的概率最低,并发度最高。

二、MyISAM表锁

分为 表共享读锁和表独占写锁。MyISAM在执行查询语句(SELECT)时,会自动给涉及的所有表加读锁,在执行更新(INSERT,DELETE,UPDATE)时,会自动给设计的表加 写锁。

不会出现死锁的原因:MyISAM总是一次获得SQL语句所需要的全部锁,如果一次性获取不到所有的锁,则会等待。

并发插入:MyISAM存储引擎 的系统变量 concurrent_insert 变量,控制并发插入的行为。 为0时,不允许并发插入;为1时,是默认设置,当MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表(SELECT)的同时,另一个进程从表尾插入(INSERT)记录;为 2时,总是允许并发插入,可以定期执行  optimize table 来整理空洞。

MyISAM锁调度:一个进程请求某个MyISAM表的读锁,同时另一个进程请求同一个表的写锁,那么  写进程会优先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁请求也会插入到读锁请求之前,因为 MySQL认为 写请求一般比读请求更重要。 这就解释了,MyISAM引擎不适用于 有大量更新(UPDATE)操作和查询(SELECT)操作的原因,大量的UPDATE操作会造成查询操作很难获得读锁,查询性能很低。反过来,很耗时的查询操作也会造成写锁等待很长时间,降低写性能,应当在数据库空闲时,或者通过中间表的方式操作。

三、InnoDB锁

InnoDB和MyISAM 突出的不同点在于:事务和行锁。

行锁实现方式:InnoDB行锁是通过给索引上的索引项加锁来实现的,这意味着,只有通过 索引条件检索数据,InnoDB才使用行锁,否则,将使用表锁。所以,为了能很好的利用行锁的性能,需要给大部分的条件列建立合适的索引。

间隙锁:范围查询时,对于符合条件的已有数据,InnoDB会加锁;对于键值在条件范围内,但不存在的记录,InnoDB会加上间隙锁。

间隙锁的目的: 1、防止幻读,读去这个间隙的时候,不允许其他线程在此间隙插入数据  2、满足恢复和复制的需要。

间隙锁的缺点:范围查询导致大范围的记录被加锁,从而阻塞整个范围内键值的插入,对并发写入性能有很大影响。所以,InnoDB存储引擎下,尽量使用相等条件来进行数据操作。

猜你喜欢

转载自blog.csdn.net/weixin_37882382/article/details/83185270