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