一、Latch和Lock的区别
Latch称为闩锁,轻量级的锁,要求锁定的时间 非常短。latch在InnoDB中又分为mutext(互斥量)和rwlock(读写锁)。通常没有死锁检测机制。
Lock的对象是事务,锁定的是数据库中的对象,如表、页、行。一般lock对象只有在事务commit和rollback时才会释放。Lock是有死锁机制的。
通过SHOW ENGINE INNODB MUTEX可以查看latch的情况:
二、锁的类型
InnoDB实现了两种标准的行锁
• 共享锁(S Lock):允许事务读一行数据;
• 排他锁(X Lock):允许事务删除或更新一条数据。
S锁与S锁是兼容的,X锁和X锁、S锁都不兼容。
支持多粒度锁定,允许事务在行级锁和表级锁同时存在。为了支持在不同粒度上的加锁操作,InnoDB支持另外一种锁的方式,叫意向锁(Intention Lock)。意向锁将锁定的对象分为多个层次,如果需要对页上的记录R加锁,就需要对数据库A、表、页上意向IX锁,最后对记录R上X锁。若其中任一部分导致等待,那么该操作作需要等待粗粒度的完成。举例来说,在对记录R加X锁之前,已经有事务对表1加了S锁,之后事务需要对记录R在表1上加IX锁,由于不兼容,该事务需要等表操作的完成。
意向锁为表级别的锁,设计的目的是为了在事务中揭示下一行将被请求的锁类型。其支持两种意向锁:
• 意向共享锁(IS Lock): 事务想要获取表中某几行的共享锁;
意向排他锁(IX Lock): 事务想要获取表中某几行的排他锁。
可以通过SHOW ENGINE INNODB STATUS来查看锁的信息:
TRANSACTIONS
Trx id counter 0 156349007
Purge done for trx’s n:o < 0 156348941 undo n:o < 0 0
History list length 121
LIST OF TRANSACTIONS FOR EACH SESSION:
—TRANSACTION 0 0, not started, process no 26735, OS thread id 1841191232
MySQL thread id 12401481, query id 2250196289 100.84.130.199 ka
可以通过INFORMATION_SCHEMA架构下的INNODB_TRX ,INNODB_LOCKS和INNODB_LOCK_WAITS这三张表,可以简单地监控当前事务并分析可能存在的锁问题。
INNODB_TRX的字段含义:
INNODB_LOCKS表的含义:
INNODB_LOCK_WAITS表的字段 含义:
根据上面的表,可以通过联合查询来获取锁的信息:
1 | SELECT r.`trx_id` waiting_trx_id, |
参考《MySQL技术内幕 -InnoDB存储引擎》整理,如侵权请联系vinin@163.com。