innodb_trx ## 當前運行的所有事務
innodb_locks ## 當前出現的鎖
innodb_lock_waits ## 鎖等待的對應關系
innodb_trx表列信息:
trx_id: 唯一事務id號;
TRX_WEIGHT:事務的高度;
TRX_STATE: 事務的執行狀態,值一般分為:RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING
RX_REQUESTED_LOCK_ID:如果trx_state是lockwait,顯示事務當前等待鎖的id,不是則為空。想要獲取鎖的信息,
根據該lock_id,以innodb_locks表中lock_id列匹配條件進行查詢,獲取相關信息。
TRX_WAIT_STARTED:如果trx_state是lockwait,該值代表事務開始等待鎖的時間;否則為空。
TRX_MYSQL_THREAD_ID:mysql線程id。想要獲取該線程的信息,根據該thread_id,以INFORMATION_SCHEMA.PROCESSLIST表的id列為匹配條件進行查詢。
TRX_QUERY:事務正在執行的sql語句。
INNODB_LOCKS表列信息:
desc innodb_locks;
+————-+———————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————-+———————+——+—–+———+——-+
| lock_id | varchar(81) | NO | | | |#鎖ID
| lock_trx_id | varchar(18) | NO | | | |#擁有鎖的事務ID
| lock_mode | varchar(32) | NO | | | |#鎖模式
| lock_type | varchar(32) | NO | | | |#鎖類型
| lock_table | varchar(1024) | NO | | | |#被鎖的表
| lock_index | varchar(1024) | YES | | NULL | |#被鎖的索引
| lock_space | bigint(21) unsigned | YES | | NULL | |#被鎖的表空間號
| lock_page | bigint(21) unsigned | YES | | NULL | |#被鎖的頁號
| lock_rec | bigint(21) unsigned | YES | | NULL | |#被鎖的記錄號
| lock_data | varchar(8192) | YES | | NULL | |#被鎖的數據
+————-+———————+——+—–+———+——-+
innodb_lock_waits 表列信息:
desc innodb_lock_waits;
+——————-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——————-+————-+——+—–+———+——-+
| requesting_trx_id | varchar(18) | NO | | | |#請求鎖的事務ID
| requested_lock_id | varchar(81) | NO | | | |#請求鎖的鎖ID
| blocking_trx_id | varchar(18) | NO | | | |#當前擁有鎖的事務ID
| blocking_lock_id | varchar(81) | NO | | | |#當前擁有鎖的鎖ID
+——————-+————-+——+—–+———+——-+
mysql> create database test ;
Query OK, 1 row affected (0.01 sec)
mysql> show create database test \G
*************************** 1. row ***************************
Database: test
Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.00 sec)
mysql> use test;
Database changed
mysql> show tables ;
Empty set (0.00 sec)
mysql> create table tx1
-> (id int primary key ,
-> c1 varchar(20),
-> c2 varchar(30))
-> engine=innodb default charset = utf8 ;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into tx1(id,c1,c2) values(1,'aaa','aaa2') ;
Query OK, 1 row affected (0.00 sec)
mysql> insert into tx1(id,c1,c2) values(2,'bbb','bbb2') ;
Query OK, 1 row affected (0.00 sec)
mysql> insert into tx1(id,c1,c2) values(3,'ccc','ccc2') ;
Query OK, 1 row affected (0.01 sec)
1) 首先不開啟事務,測試update更新
mysql> update tx1 set c1='ccc3' where id=3 ;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
開啟另外一個窗口查看:innodb_trx 發現事務為空
mysql> select * from innodb_trx \G
Empty set (0.01 sec)
2) 開啟事務,測試update更新
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update tx1 set c1='ccc4' where id=3 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
開啟另外一個窗口查看:innodb_trx 事務
mysql> select * from innodb_trx \G
*************************** 1. row ***************************
trx_id: 1297
trx_state: RUNNING
trx_started: 2021-12-10 00:03:34
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 5
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 1
trx_lock_structs: 2
trx_lock_memory_bytes: 1136
trx_rows_locked: 1
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0
innodb_locks 和innodb_lock_waits信息也是空的,說明當前沒有鎖和鎖等待。
在第一個會話窗口里提交事務commit后,第二個窗口innodb_trx沒運行事務。
或者是通過kill 將那個開啟事務的會話殺掉也行,

mysql> kill 5;
Query OK, 0 rows affected (0.00 sec)
mysql> show processlist ;
+----+------+-----------+--------------------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+--------------------+---------+------+----------+------------------+
| 6 | root | localhost | information_schema | Query | 0 | starting | show processlist |
| 7 | root | localhost | test | Sleep | 14 | | NULL |
+----+------+-----------+--------------------+---------+------+----------+------------------+

kill完會話,連接session自動重連上。
3) update 更新,產生鎖等待測試
第二個窗口開啟事務,更新同一條記錄:
有locks
可以看出1303的 事務id鎖住了1304的事務。
查詢當前鎖表狀態語句如下:show oepn tables where In_use >0