1,测试
1)创建测试数据
创建库:create database testdb default character set utf8mb4;
创建表:create table test_tx(id int primary key, name varchar(20), pwd varchar(30)) engine=innodb default charset = utf8mb4;
创建索引:alter table test_tx add index idx_name(name);
插入数据:insert into test_tx values(1,"hzq","123"),(2,"hh","11"),(3,"zq","22");
2)开启两个session。
查看事务表信息select trx_mysql_thread_id,trx_id,trx_started,trx_wait_started,trx_requested_lock_id,trx_query,trx_rows_locked,trx_rows_modified from information_schema.innodb_trx;
查看mysql线程信息
开启Session2,模拟 产生锁等待,session 1一直不commit,最后会锁等待超时
。
查看事务表,锁信息,锁等待信息。
3)简单说明
只要产生事务,在 innodb_trx 就有数据
如果没有产生锁等待,在innodb_locks和innodb_lock_waits无数据
事务由哪个mysql线程执行,information_schema.innodb_trx中trx_mysql_thread_id 是show processlist中mysql线程的id
锁住的是哪个事务information_schema.innodb_locks中lock_trx_id是innodb_trx中事务的trx_id
请求锁和持有锁的事务information_schema.innodb_lock_waits中requesting_trx_id是请求锁的事务id,blocking_trx_id是持有锁的事务id
2,information_schema中innodb_trx,innodb_locks,innodb_lock_waits表说明
1)事务表。innodb_trx
trx_started事务开始时间
trx_wait_started事务开始等待的时间
trx_requested_lock_id事务请求的锁id,innodb_locks.lock_id
mysql行锁基于索引,当检索条件中使用了索引时,使用行锁,否则使用表级锁。
2)锁信息表。
3)锁等待信息表