数据库锁的排查方式

锁的类型

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 COMMITTEDREPEATABLE READ(InnoDB存储引擎的默认事务隔离级别)下,InnoDB存储引擎使用非锁定的一致性读。然而,对于快照数据的定义却不相同。

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

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

Last updated

Was this helpful?