MySQL 锁等待分析


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命令
输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM