MYSQL初级知识点——锁机制
树图思维导图提供 锁机制 在线思维导图免费制作,点击“编辑”按钮,可对 锁机制 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:56cc353b0fed5ceb1cd8f2868d70fa5f
锁机制思维导图模板大纲
锁是计算机协调多个进程或线程并发访问某一资源的机制。
数据库锁机制简单说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。
对数据操作的类型分类
读锁(共享锁)
写锁(排他锁)
对数据操作的粒度分类
表级锁
行级锁
页面锁
适用:从锁的角度来说,表锁适合已查询为主,只有少量按索引条件更新数据的应用。行锁适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。
MyISAM表锁
表锁两种模式
表共享读锁
表独占写锁
MyISAM表的读操作与写操作之间,以及写操作之间是串行的。
默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列的获取锁请求。
InnoDB行锁
InnoDB实现了2种行锁类型
共享锁(S)
排他锁(X)
为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(都是表锁)
意向共享锁(IS)
意向排它锁(IX)
索引失效hi导致行锁变表锁。比如:varchar 查询不写单引号的情况。
加锁机制
乐观锁与悲观锁
乐观锁
悲观锁
InnoDB的三种行锁
记录锁(Record Locks)
SELECT * FROM table WHERE id = 1 FOR UPDATE;
UPDATE SET age = 50 WHERE id = 1; -- id 列为主键或唯一索引列
间隙锁(Gap Locks)
间隙锁基于非唯一索引,使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据。
SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE;
Gap锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。
临键锁(Next-key Locks)
可以理解为一种特殊的间隙锁,通过临键锁可以解决幻读的问题。每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据的临键锁时,会锁住一段左开右闭区间的数据。InnoDB中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。
死锁产生
死锁是指两个或多个事务在同一资源上互相占用,并请求锁定占用的资源,从而导致恶性循环。
当事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时也可能回发生死锁。
锁的行为和顺序和存储引擎相关。以同样的顺序执行语句,有些存储引擎会产生死锁,有些不会。
死锁有两个原因:真正数据冲突;存储引擎的实现方式;
检测死锁
数据库系统实现了各种死锁检测和死锁超时的机制,InnoDB存储引擎能检测到死锁的循环依赖并立即返回一个错误。
死锁恢复
死锁发生后,只有部分或完全回滚其中一个事务,才能打破死锁。InnoDB目前处理死锁的方法是:将持有最少行级排它锁的事务进行回滚。
外部锁的死锁检测
发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。但在涉及外部锁或涉及表锁的情况下,InnoDB并不能完全自动检测到死锁,这需要通过设置锁等待超时参数innodb_lock_wait_timeout来解决。
死锁影响性能
死锁会影响性能而不是产生严重错误,因为InnoDB会自动检测并处理死锁。在高并发系统上,当许多线程等待同一个锁时,死锁检测可能导致速度变慢。有时当发生死锁时,禁用死锁检测(innodb_deadlock_detect配置选项)可能会更有效,这时可以依赖 innodb_lock_wait_timeout 设置进行事务回滚。
MyISAM避免死锁
在自动加锁的情况下,MyISAM总是一次获得SQL语句所需要的全部锁,所以MyISAM表不会出现死锁。
InnoDB避免死锁
使用 select ... for update 语句获取必要的锁;
直接申请足够级别的锁;
约定多个表的访问顺序;
改变事务隔离级别
树图思维导图提供 第六章 群体传播与组织传播_副本 在线思维导图免费制作,点击“编辑”按钮,可对 第六章 群体传播与组织传播_副本 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:1672f555831e7d9a3bb2cf2fb792cb49
树图思维导图提供 无人健身房品牌竞争 在线思维导图免费制作,点击“编辑”按钮,可对 无人健身房品牌竞争 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:9b895d8f01857f3c0fcf787637c65f0e