数据库工作台 DBW 提供事务与锁功能。通过该功能,您可以更直观地查看在数据库内发生的所有锁信息,包括死锁信息。通过分析锁,可以帮助您使用更合适的 SQL 语句避免发生死锁情况,提高资源使用效率,在数据库被并发访问时保证数据的一致性和完整性。
在数据库系统中,锁是数据库在多个进程并发访问时,保证数据一致性和完整性的主要机制。在 MySQL 数据库中锁可以按照粒度分为锁定某个表的表级锁和锁定表内数据行的行级锁。
其中,表级锁包含意向共享锁(IS)和意向排他锁(IX),行级锁分为共享锁(S)和独占锁(X)。在 InnoDB 中支持多粒度锁,允许行级锁和表级锁并存,各种锁类型的兼容性如下表所示:
锁类型 | 独占锁(X) | 意向排他锁(IX) | 共享锁(S) | 意向共享锁(IS) |
---|---|---|---|---|
独占锁(X) | 冲突 | 冲突 | 冲突 | 冲突 |
意向排他锁(IX) | 冲突 | 兼容 | 冲突 | 兼容 |
共享锁(S) | 冲突 | 冲突 | 兼容 | 兼容 |
意向共享锁(IS) | 冲突 | 兼容 | 兼容 | 兼容 |
兼容:当请求事务与现有锁兼容时,则将锁授予请求事务。
冲突:当请求事务与现有锁冲突时,则不会授予请求事务,请求事务将等待有冲突的现有锁释放后再执行后续操作,该情况可能会导致死锁从而发生错误的情况。
死锁页签仅展示最近一次的死锁信息,且查询结果保留 1 天。
实例的参数innodb_deadlock_dect
需为ON
,否则将无法查询死锁信息。具体参数配置步骤,请参见修改参数。
当 MySQL 的版本为 5.7 或以下版本时,您需要关注以下信息:
事务间无锁冲突时,无法检测锁的具体信息,例如锁 ID、锁关联索引和锁关联表等。
当出现环形死锁且该死锁内包含 3 个或以上事务时,则仅展示死锁中两个事务的详细信息。
当出现死锁时,可展示死锁信息中事务的详细信息,但仅有一个事务可展示他的持有锁信息,例如:
事务 1:事务信息、等待锁信息(锁、索引名和类型)。
事务 2:事务信息、等待锁信息(锁、索引名和类型)、持有锁信息(锁、索引名和类型)。
死锁信息里的请求类型包括 alter
、show
、select
、update
、drop
、delete
、create
和 other type
。
示例一:锁信息
假设存在事务 A、B 和 C,事务 A 持有数据的独占锁,事务 B、C 同时也在请求处理数据,此时数据中既存在事务 A 的持有锁,也存在事务 B 和 C 的等待锁。
示例二:死锁信息
假设事务 A 持有数据 1 的独占锁,事务 B 持有数据 2 的独占锁,当事务 A 要处理数据 2,事务 B 要处理数据 1 时,事务 A 的持有锁阻塞了事务 B 的请求,事务 B 的持有锁阻塞了事务 A 的请求,由此形成了环形死锁。流程如下所示。
序号 | 说明 | |
---|---|---|
① | 实例切换区域 | 在该区域左上角,切换实例。当前仅支持接入云数据库 MySQL 版实例。 |
② | 事务与锁详情区域 | 在该区域内,您可以进行以下操作:
|
关于如何查看锁的详细信息,请参见管理事务与锁。