Mysql查询当前数据库有哪些事务、都锁定哪些资源

本文深入解析InnoDB存储引擎中的事务与锁机制,通过SQL查询展示事务状态、资源等待、使用的表与锁信息,以及锁等待情况,帮助读者理解数据库内部运行机制。
SELECT
    trx_id AS  `事务ID`,
    trx_state AS `事务状态`,
    trx_requested_lock_id  AS  `事务需要等待的资源`,
    trx_wait_started    AS  `事务开始等待时间`,
    trx_tables_in_use AS `事务使用表`,
    trx_tables_locked AS `事务拥有锁`,
    trx_rows_locked  AS `事务锁定行`,
    trx_rows_modified  AS `事务更改行`
FROM
    information_schema.innodb_trx ;
SELECT
    lock_id         AS  `锁ID`,
    lock_trx_id    AS  `拥有锁的事务ID`,
    lock_mode      AS  `锁模式    `,
    lock_type      AS  `锁类型`,
    lock_table         AS  `被锁的表`,
    lock_index         AS  `被锁的索引`,
    lock_space         AS  `被锁的表空间号`,
    lock_page      AS  `被锁的页号`,
    lock_rec       AS  `被锁的记录号`,
    lock_data      AS  `被锁的数据`
FROM
    information_schema.innodb_locks;
SELECT
  requesting_trx_id   AS  `请求锁的事务ID`,
  requested_lock_id   AS  `请求锁的锁ID`,
  blocking_trx_id     AS  `当前拥有锁的事务ID`,
  blocking_lock_id    AS  `当前拥有锁的锁ID`
FROM
  innodb_lock_waits;

 

MySQL 数据库查看当前哪些数据(或表)处于锁定状态,可以通过多种方式实现。以下是一些常用的方法: ### 1. 查询当前被打开且正在使用的表 使用 `SHOW OPEN TABLES` 命令可以查看当前数据库中哪些表正在被使用(即被锁定的状态)。具体命令如下: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` 该命令会列出所有当前正在被访问的表,并显示它们的使用次数。如果 `In_use` 的值大于 0,则表示该表当前锁定 [^3]。 --- ### 2. 查看 InnoDB 存储引擎的信息 如果使用的是 InnoDB 存储引擎,可以通过查询系统表 `INFORMATION_SCHEMA` 中的视图来获取信息。 #### 查看当前正在持有的 ```sql SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; ``` 此命令会显示当前所有 InnoDB 表中被持有的信息,包括的类型、事务 ID、索引名称等 [^2]。 #### 查看等待事务 ```sql SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; ``` 该命令会显示当前所有等待事务信息,包括事务等待的资源和持有事务 [^2]。 --- ### 3. 查看当前数据库的线程活动 通过 `SHOW PROCESSLIST` 命令可以查看当前所有数据库连接和线程的活动状态。如果有线程处于等待状态,可能表示它正在等待某个释放。 ```sql SHOW PROCESSLIST; ``` 输出结果中的 `State` 字段可以提供关于线程状态的信息,例如 `Waiting for table metadata lock` 表示该线程正在等待表的元数据 [^3]。 --- ### 4. 使用 `SHOW ENGINE INNODB STATUS` 查看信息 此命令可以获取 InnoDB 存储引擎的详细状态信息,其中包括当前的详细情况。 ```sql SHOW ENGINE INNODB STATUS; ``` 在输出结果中查找 `TRANSACTIONS` 和 `LOCK` 部分,可以找到当前事务的详细信息 [^2]。 --- ### 5. 使用性能模式(Performance Schema) MySQL 的性能模式提供了更细粒度的监控功能。可以通过启用 `performance_schema` 来监控等待事件。 #### 启用等待监控 ```sql UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE '%wait/lock%'; ``` #### 查询等待事件 ```sql SELECT * FROM performance_schema.events_waits_current WHERE EVENT_NAME LIKE '%lock%'; ``` 此命令可以实时查看当前发生的等待事件 。 --- ### 6. 使用 `sys` 数据库MySQL 5.7+) MySQL 5.7 引入了 `sys` 数据库,其中包含了一些预定义的视图,可以简化对事务的监控。 #### 查看当前等待的线程 ```sql SELECT * FROM sys.x$processlist WHERE command = 'Sleep'; ``` 此命令可以查看当前处于睡眠状态的线程,这些线程可能是由于等待而处于休眠状态 [^2]。 #### 查看等待的详细信息 ```sql SELECT * FROM sys.x$innodb_lock_waits; ``` 此命令会显示所有 InnoDB 等待的详细信息,包括等待事务和持有事务 。 --- ### 总结 - **`SHOW OPEN TABLES`** 可以查看当前正在被使用的表。 - **`INFORMATION_SCHEMA.INNODB_LOCKS`** 和 **`INFORMATION_SCHEMA.INNODB_LOCK_WAITS`** 可以查看 InnoDB 的信息。 - **`SHOW PROCESSLIST`** 可以查看当前线程的活动状态。 - **`SHOW ENGINE INNODB STATUS`** 提供了 InnoDB 的详细状态。 - **性能模式(Performance Schema)** 和 **`sys` 数据库** 提供了更高级的监控功能。 通过这些方法,可以全面了解 MySQL 数据库当前锁定的数据状态。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值