Session 1:
mysql> set global innodb_lock_wait_timeout=600;
mysql> set innodb_lock_wait_timeout=600; mysql> create table temp(id int primary key,name varchar(10)); mysql> insert into temp values(1,'a'),(2,'b'),(3,'c'); mysql> set autocommit=0; mysql> update temp set name='aa' where id=1; mysql> update temp set name='aa' where id=2;
Session 2:
mysql> set global innodb_lock_wait_timeout=600;
mysql> set innodb_lock_wait_timeout=600; mysql> set autocommit=0; mysql> update temp set name='bb' where id=1;
-----------------------------------------------分析方法------------------------------------------------
mysql> show full processlist;
mysql> select trx_id,trx_state,trx_started,trx_tables_locked,trx_rows_locked,trx_query from information_schema.innodb_trx; mysql> select engine_lock_id,engine_transaction_id,lock_mode,lock_type,index_name,object_name,lock_data,lock_status,thread_id from performance_schema.data_locks; mysql> select locked_table_name,locked_index,waiting_pid,waiting_lock_id,blocking_lock_id,blocking_pid from sys.innodb_lock_waits; mysql> select thread_id,event_id,event_name,sql_text from performance_schema.events_statements_history where thread_id in (49,46) order by thread_id,event_id;
MySQL5.7锁机制和事务
• Information_schema.innodb_trx
记录了InnoDB中每一个正在执行的事务,包括该事务获得的锁信息,事务开始时间,事务是否在等待锁等信息
• Information_schema.innodb_locks
记录了InnoDB中事务在申请但目前还没有获取到的每个锁信息,以及当前事务的锁正在阻止其他事务获得锁
• Information_schema.innodb_lock_waits
记录了InnoDB中事务之间相互等待锁的信息
MySQL8.0锁机制和事务
• Information_schema.innodb_trx
记录了InnoDB中每一个正在执行的事务,包括该事务获得的锁信息,事务开始时间,事务是否在等待锁等信息
• performance_schema.data_locks
记录了InnoDB中事务的每个锁信息,以及当前事务的锁正在阻止其他事务获得锁
• sys.innodb_lock_waits
记录了InnoDB中事务之间相互等待锁的信息
• processlist命令
输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。