1、锁模型
InnoDB有两种锁模型:共享锁、排它锁。
共享锁(S):阻止其他链接行写,允许读取行,读取之前获得锁
排他锁(X):阻止其他链接读取行,根据事物隔离级别决定是否可写入行,写入前获得锁
事务在获取锁之前,需要获取意向锁(intention lock-I),意向锁是事务获取锁之前需要等待,目的是防止不同连接获得的锁在相同行上。
锁之间的阻塞关系
锁 被阻塞
X X, S, IX, IS
S X, IS
IX X, S
IS X
2、锁类型
表级锁
锁住整张表,通过LOCK TABLES来获得表级锁,在实践中不提倡使用,在InnoDB中一般不使用。使用innodb_table_locks服务参数打开该功能,LOCK TABLES的目的是保证非事物表的一致性,比如Aria 和MyISAM。表级锁不仅仅是锁住事务中的行,而是锁住整个表,因此性能极差。
行级锁
Record Lock: 作用于单个索引记录。如果表没有明确创建索引,锁将作用于聚集索引(clustered index)中的记录。
Next-Key Lock:作用于一个索引记录及它之前的所有记录,这样可以防止其他连接插入或修改当前事务已访问的记录,只能用于重复读(REPEATABLE READ)
Gap Lock:锁定一个结果集,集合可以是一条记录、多条记录及空集合。该锁不能用于使用UNIQUE索引查询的单条记录上,除非是多列索引。一个特殊示例是插入间隙锁,该锁在插入新行前获得,当其他连接试图使用相同索引值插入行时,它将挂起等待当前事务提交或者回滚。该锁不能用于读提交(READ COMMITTED)
锁诊断
使用 SHOW ENGINE INNODB STATUS快速查看锁信息
使用SHOW PROCESSLIST查看数据库进程信息
锁信息存放位置information_schema.INNODB_LOCKS表中
表INNODB_LOCK_WAITS中包含等待获取锁的事务,阻塞事务信息
3、读一致
不可重复读(The non-repeatable reads)
在当前事务没有修改数据的情况下,执行两次查询得到不同的结果,引发原因是当前事务没有同其他修改请求的连接相隔离,侧重数据的修改。
幻读(Phantom reads)
执行两次范围查询语句,得到的数据行记录不同,主要是数据的新增、删除影响。
一致性读(Consistent reads)
不使用锁,当前线程第一次读表是创建一个快照,使用START TRANSACTION WITH CONSISTENT SNAPSHOT开启,当提交事务时,快照中的更改更新到表中,从而对所有连接可见。在重复读隔离级别中使用。
锁定读(Locking reads)
比一致性读更强,需要锁表。在select语句中使用 LOCK IN SHARE MODE 或 FOR UPDATE。
LOCK IN SHARE MODE阻止其他连接修改数据,但可以读。如果事务隔离级别为SERIALIZABLE且自动提交为FALSE,LOCK IN SHARE MODE总会被添加到select语句中。
FOR UPDATE 排他锁(X)。
4、事务隔离级别
读未提交(READ UNCOMMITTED)
在事务执行时为每个读命令创建一个单独的快照,读取使用数据快照,此事务中的数据可能包含未提交的数据,因此表中可能并不包含此数据
读提交(READ COMMITTED)
在事务中为每个一致性读设置一个不同的快照,不会使用为提交的数据创建快照。更新、删除语句及锁定读不会使用间隙锁(gap lock)
重复读取(REPEATABLE READ)
事务内的所有读使用相同快照,有比读提交更强的一致性约束,更新、删除语句及锁定读及record lock 使用唯一索引,gap lock及next-key lock 则会阻塞
串行化(SERIALIZABLE)
可以认为重复读取模式下所有非锁定select自动转换为LOCK IN SHARE MODE,这两者是等价的:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT ....LOCK IN SHARE MODE;
UPDATE ...;
COMMIT;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT ...;
UPDATE ...;
COMMIT;
分享到:
相关推荐
《MySQL内核:InnoDB存储引擎 卷1》由资深MySQL专家,机工畅销图书作者亲自执笔,在以往出版的两本InnoDB介绍性图书的基础之上,更深入地介绍InnoDB存储引擎的内核,例如latch、B+树索引、事务、锁等,从源代码的...
最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...
《MySQL内核:InnoDB存储引擎 卷1》是一本深度探讨MySQL数据库系统核心部分——InnoDB存储引擎的专业书籍。这本书以超高清的PDF格式呈现,包含详细的书签,便于读者快速定位和查阅相关内容。InnoDB作为MySQL中最常用...
《MySQL技术内幕:InnoDB存储引擎》是一本深入解析InnoDB存储引擎的经典之作,由国内资深MySQL专家亲自执笔,国内外多位数据库专家联袂推荐。本书从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制,并...
MySQL技术内幕InnoDB存储引擎-读书笔记.pdf
其中,InnoDB作为MySQL中最常用的存储引擎之一,提供了众多高级特性,如事务支持、行级锁定以及外键约束等。本文将详细介绍如何在MySQL中启用InnoDB存储引擎,并对比分析InnoDB与其他存储引擎(如MyISAM)之间的主要...
MySQL5.6版InnoDB深度介绍。
《MySQL技术内幕:InnoDB存储引擎》是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、...
MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月
可作为深入理解MySQL InnoDB存储引擎实现细节的研究学习。
《MySQL技术内幕_InnoDB存储引擎_姜承尧_第2版》是一本深入探讨MySQL数据库中InnoDB存储引擎的专业书籍。作者姜承尧是数据库领域的知名专家,他的这部著作详细阐述了InnoDB引擎的核心概念、设计原理以及实际操作技巧...
本文实例讲述了mysql更改引擎(InnoDB,MyISAM)的方法,分享给大家供大家参考。具体实现方法如下: mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。 查看当前数据库的所支持的...
MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...
在MySQL数据库系统中,InnoDB存储引擎是非常重要的一种类型,它支持事务处理(Transactions)、行级锁定(Row-Level Locking)以及外键约束(Foreign Key Constraints),这些特性使得InnoDB成为大多数应用场景中的...
MYSQL内核:INNODB存储引擎 卷1.part3.rar
MYSQL内核:INNODB存储引擎 卷1.part2.rar
InnoDB是MySQL中最常用的一种存储引擎,它支持事务安全性和行级锁定,这使得它非常适合处理高并发或多用户的应用场景。InnoDB提供了多种高级功能,如外键约束、事务管理以及崩溃恢复机制等。 3. **MySQL与InnoDB的...
本文详细介绍了mysql innodb引擎的原理、配置、调优、故障排除等
《高性能mysql(第3版)》是最具代表性的进阶书籍没有之一,它是 MySQL 领域的经典之作,内容涵盖 MySQL 架构和历史,性能分析,优化,复制、备份和恢复,高可用与高可扩展性。值得每一个后端工程师多次阅读,无论是...
MySQL技术引擎内幕 Innodb存储引擎