You need to enable JavaScript to run this app.
导航
事务与锁
最近更新时间:2023.06.09 16:11:17首次发布时间:2023.02.02 11:56:25

数据库工作台 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:事务信息、等待锁信息(锁、索引名和类型)、持有锁信息(锁、索引名和类型)。

  • 死锁信息里的请求类型包括 altershowselectupdatedropdeletecreateother type

典型示例

  • 示例一:锁信息

    假设存在事务 A、B 和 C,事务 A 持有数据的独占锁,事务 B、C 同时也在请求处理数据,此时数据中既存在事务 A 的持有锁,也存在事务 B 和 C 的等待锁。

  • 示例二:死锁信息

    假设事务 A 持有数据 1 的独占锁,事务 B 持有数据 2 的独占锁,当事务 A 要处理数据 2,事务 B 要处理数据 1 时,事务 A 的持有锁阻塞了事务 B 的请求,事务 B 的持有锁阻塞了事务 A 的请求,由此形成了环形死锁。流程如下所示。

事务与锁界面介绍

alt

序号说明
实例切换区域在该区域左上角,切换实例。当前仅支持接入云数据库 MySQL 版实例。

事务与锁详情区域

在该区域内,您可以进行以下操作:

  • 查看 InnoDB 事务与锁信息
      筛选所有事务执行时间大于某指定执行时间的 InnoDB 事务与锁信息,包括会话 ID事务 ID事务状态事务隔离级别事务开始时间事务等待时间被阻塞的 SQL 等。
      同时,您可以单击会话前的加号图标,查看每个会话内事务持有锁、等待锁的详细信息,包括锁ID锁关联索引锁关联表锁类型锁模式等。
  • 查看死锁信息
      筛选所有事务执行时间大于某指定执行时间的死锁信息,包括死锁发生时间死锁收集时间事务信息Session id请求类型涉及表等待锁等待锁索引名称等待锁类型等。

相关文档

关于如何查看锁的详细信息,请参见管理事务与锁