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命令
輸出結果顯示了有哪些線程在運行,不僅可以查看當前所有的連接數,還可以查看當前的連接狀態幫助識別出有問題的查詢語句等。