# 数据库锁的排查方式

## 锁的类型

InnoDB存储引擎实现了如下两种标准的行级锁：

* 共享锁（S Lock），允许事务读一行数据。
* 排他锁（X Lock），允许事务删除或更新一行数据。

为了支持在不同粒度上进行加锁操作，InnoDB存储引擎支持一种额外的锁方式，称之为意向锁（Intention Lock）。其意向锁即为表级别的锁。其支持两种意向锁：

* 意向共享锁（IS Lock），事务想要获得一张表中某几行的共享锁
* 意向排他锁（IX Lock），事务想要获得一张表中某几行的排他锁

## 锁问题排查

从InnoDB1.0开始，在INFORMATION\_SCHEMA架构下添加了表INNODB\_TRX、INNODB\_LOCKS、INNODB\_LOCK\_WAITS

需要排查锁问题时，从这3个表下手

* INNODB\_TRX：事物相关信息
* INNODB\_LOCKS：锁相关信息
* INNODB\_LOCK\_WAITS：未获得锁，其他事务正占用锁中，等待其锁的释放

其中各表结构及示例讲解详见《MySQL技术内幕：InnoDB存储引擎（第2版）》6.3.1小节

## 一致性非锁定读

在事务隔离级别`READ COMMITTED`和`REPEATABLE READ`（InnoDB存储引擎的默认事务隔离级别）下，InnoDB存储引擎使用非锁定的一致性读。然而，对于快照数据的定义却不相同。

在`READCOMMITTED`事务隔离级别下，对于快照数据，非一致性读总是读取**被锁定行的最新一份快照数据**。

而在`REPEATABLE READ`事务隔离级别下，对于快照数据，非一致性读总是读取**事务开始时的行数据版本**。
