記一次處理MySql鎖等待(Lock wait timeout exceeded)

  • 環境html

    MySQL5.5 mysql

  • 現象sql

    A.數據更新或新增後數據常常自動回滾。數據庫

    B.表操做總報 Lock wait timeout exceeded 並長時間無反應session

  • 解決方法併發

    A.應急方法:show processlist; kill掉出現問題的進程測試

    B.根治方法:select * from innodb_trx 查看有是哪些事務佔據了表資源。spa

        C.個人方法:設置MySQL鎖等待超時 innodb_lock_wait_timeout=50 ,autocommit=on.net

  • 該類問題致使緣由線程

    據我分析,Mysql的 InnoDB存儲引擎是支持事務的,事務開啓後沒有被主動Commit。致使該資源被長期佔用,其餘事務在搶佔該資源時,因上一個事務的鎖而致使搶佔失敗!所以出現 Lock wait timeout exceeded 

  • 接下來是轉載的內容



  • 轉載:http://blog.sina.com.cn/s/blog_6bb63c9e0100s7cb.html

  • MySQL 5.5 -- innodb_lock_wait 鎖 等待

  • 記得之前,當出現:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,
    要解決是一件麻煩的事情 ;
    特別是當一個SQL執行完了,但未COMMIT,後面的SQL想要執行就是被鎖,超時結束;
    DBA光從數據庫沒法着手找出源頭是哪一個SQL鎖住了;
    有時候看看show engine innodb status , 並結合 show full processlist; 能暫時解決問題;但一直不能精肯定位;

  • 在5.5中,information_schema 庫中增長了三個關於鎖的表(MEMORY引擎);
    innodb_trx ## 當前運行的全部事務
    innodb_locks ## 當前出現的鎖
    innodb_lock_waits ## 鎖等待的對應關係

  • 看到這個就很是激動 ; 這但是解決了一個大麻煩,先來看一下表結構


  • root@127.0.0.1   : information_schema 13:28:38> desc innodb_locks;
    +-------------+---------------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------------+---------------------+------+-----+---------+-------+
    | lock_id | varchar(81) | NO | | | |#鎖ID
    | lock_trx_id | varchar(18) | NO | | | |#擁有鎖的事務ID
    | lock_mode | varchar(32) | NO | | | |#鎖模式
    | lock_type | varchar(32) | NO | | | |#鎖類型
    | lock_table | varchar(1024) | NO | | | |#被鎖的表
    | lock_index | varchar(1024) | YES | | NULL | |#被鎖的索引
    | lock_space | bigint(21) unsigned | YES | | NULL | |#被鎖的表空間號
    | lock_page | bigint(21) unsigned | YES | | NULL | |#被鎖的頁號
    | lock_rec | bigint(21) unsigned | YES | | NULL | |#被鎖的記錄號
    | lock_data | varchar(8192) | YES | | NULL | |#被鎖的數據
    +-------------+---------------------+------+-----+---------+-------+
    10 rows in set (0.00 sec)

    root@127.0.0.1   : information_schema 13:28:56> desc innodb_lock_waits;
    +-------------------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------------------+-------------+------+-----+---------+-------+
    | requesting_trx_id | varchar(18) | NO | | | |#請求鎖的事務ID
    | requested_lock_id | varchar(81) | NO | | | |#請求鎖的鎖ID
    | blocking_trx_id | varchar(18) | NO | | | |#當前擁有鎖的事務ID
    | blocking_lock_id | varchar(81) | NO | | | |#當前擁有鎖的鎖ID
    +-------------------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    root@127.0.0.1   : information_schema 13:29:05> desc innodb_trx ;
    +----------------------------+---------------------+------+-----+---------------------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +----------------------------+---------------------+------+-----+---------------------+-------+
    | trx_id | varchar(18) | NO | | | |#事務ID
    | trx_state | varchar(13) | NO | | | |#事務狀態:
    | trx_started | datetime | NO | | 0000-00-00 00:00:00 | |#事務開始時間;
    | trx_requested_lock_id | varchar(81) | YES | | NULL | |#innodb_locks.lock_id
    | trx_wait_started | datetime | YES | | NULL | |#事務開始等待的時間
    | trx_weight | bigint(21) unsigned | NO | | 0 | |#
    | trx_mysql_thread_id | bigint(21) unsigned | NO | | 0 | |#事務線程ID
    | trx_query | varchar(1024) | YES | | NULL | |#具體SQL語句
    | trx_operation_state | varchar(64) | YES | | NULL | |#事務當前操做狀態
    | trx_tables_in_use | bigint(21) unsigned | NO | | 0 | |#事務中有多少個表被使用
    | trx_tables_locked | bigint(21) unsigned | NO | | 0 | |#事務擁有多少個鎖
    | trx_lock_structs | bigint(21) unsigned | NO | | 0 | |#
    | trx_lock_memory_bytes | bigint(21) unsigned | NO | | 0 | |#事務鎖住的內存大小(B)
    | trx_rows_locked | bigint(21) unsigned | NO | | 0 | |#事務鎖住的行數
    | trx_rows_modified | bigint(21) unsigned | NO | | 0 | |#事務更改的行數
    | trx_concurrency_tickets | bigint(21) unsigned | NO | | 0 | |#事務併發票數
    | trx_isolation_level | varchar(16) | NO | | | |#事務隔離級別
    | trx_unique_checks | int(1) | NO | | 0 | |#是否惟一性檢查
    | trx_foreign_key_checks | int(1) | NO | | 0 | |#是否外鍵檢查
    | trx_last_foreign_key_error | varchar(256) | YES | | NULL | |#最後的外鍵錯誤
    | trx_adaptive_hash_latched | int(1) | NO | | 0 | |#
    | trx_adaptive_hash_timeout | bigint(21) unsigned | NO | | 0 | |#
    +----------------------------+---------------------+------+-----+---------------------+-------+
    22 rows in set (0.01 sec)

  • 下面咱們來動手看看數據吧:
    ##創建測試數據:
    use test;
    create table tx1
    (id int primary key ,
    c1 varchar(20),
    c2 varchar(30))
    engine=innodb default charset = utf8 ;

  • insert into tx1 values
    (1,'aaaa','aaaaa2'),
    (2,'bbbb','bbbbb2'),
    (3,'cccc','ccccc2');

  • commit;

  • ###產生事務;
    ### Session1
    start transaction;
    update tx1 set c1='heyf',c2='heyf' where id =3 ;

  • ## 產生事務,在innodb_trx就有數據 ;
    root@127.0.0.1   : information_schema 13:38:21> select * from innodb_trx G
    *************************** 1. row ***************************
    trx_id: 3669D82
    trx_state: RUNNING
    trx_started: 2010-12-24 13:38:06
    trx_requested_lock_id: NULL
    trx_wait_started: NULL
    trx_weight: 3
    trx_mysql_thread_id: 2344
    trx_query: NULL
    trx_operation_state: NULL
    trx_tables_in_use: 0
    trx_tables_locked: 0
    trx_lock_structs: 2
    trx_lock_memory_bytes: 376
    trx_rows_locked: 1
    trx_rows_modified: 1
    trx_concurrency_tickets: 0
    trx_isolation_level: REPEATABLE READ
    trx_unique_checks: 1
    trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
    trx_adaptive_hash_latched: 0
    trx_adaptive_hash_timeout: 10000
    1 row in set (0.00 sec)

  • ### 因爲沒有產生鎖等待,下面兩個表沒有數據 ;
    root@127.0.0.1   : information_schema 13:38:31> select * from innodb_lock_waits G
    Empty set (0.00 sec)

  • root@127.0.0.1   : information_schema 13:38:57> select * from innodb_locks G
    Empty set (0.00 sec)

  • #### 產生鎖等待
    #### session 2
    start transaction;
    update tx1 set c1='heyfffff',c2='heyffffff' where id =3 ;


  • root@127.0.0.1   : information_schema 13:39:01> select * from innodb_trx G
    *************************** 1. row ***************************
    trx_id: 3669D83 ##第2個事務
    trx_state: LOCK WAIT ## 處於等待狀態
    trx_started: 2010-12-24 13:40:07
    trx_requested_lock_id: 3669D83:49:3:4 ##請求的鎖ID
    trx_wait_started: 2010-12-24 13:40:07
    trx_weight: 2
    trx_mysql_thread_id: 2346 ##線程 ID
    trx_query: update tx1 set c1='heyfffff',c2='heyffffff' where id =3
    trx_operation_state: starting index read
    trx_tables_in_use: 1 ##須要用到1個表
    trx_tables_locked: 1 ##有1個表被鎖
    trx_lock_structs: 2
    trx_lock_memory_bytes: 376
    trx_rows_locked: 1
    trx_rows_modified: 0
    trx_concurrency_tickets: 0
    trx_isolation_level: REPEATABLE READ
    trx_unique_checks: 1
    trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
    trx_adaptive_hash_latched: 0
    trx_adaptive_hash_timeout: 10000
    *************************** 2. row ***************************
    trx_id: 3669D82 ##第1個事務
    trx_state: RUNNING
    trx_started: 2010-12-24 13:38:06
    trx_requested_lock_id: NULL
    trx_wait_started: NULL
    trx_weight: 3
    trx_mysql_thread_id: 2344
    trx_query: NULL
    trx_operation_state: NULL
    trx_tables_in_use: 0
    trx_tables_locked: 0
    trx_lock_structs: 2
    trx_lock_memory_bytes: 376
    trx_rows_locked: 1
    trx_rows_modified: 1
    trx_concurrency_tickets: 0
    trx_isolation_level: REPEATABLE READ
    trx_unique_checks: 1
    trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
    trx_adaptive_hash_latched: 0
    trx_adaptive_hash_timeout: 10000
    2 rows in set (0.00 sec)

  • root@127.0.0.1   : information_schema 13:40:12> select * from innodb_locks G
    *************************** 1. row ***************************
    lock_id: 3669D83:49:3:4 ## 第2個事務須要的鎖
    lock_trx_id: 3669D83
    lock_mode: X
    lock_type: RECORD
    lock_table: `test`.`tx1`
    lock_index: `PRIMARY`
    lock_space: 49
    lock_page: 3
    lock_rec: 4
    lock_data: 3
    *************************** 2. row ***************************
    lock_id: 3669D82:49:3:4 ## 第1個事務須要的鎖
    lock_trx_id: 3669D82
    lock_mode: X
    lock_type: RECORD
    lock_table: `test`.`tx1`
    lock_index: `PRIMARY`
    lock_space: 49
    lock_page: 3
    lock_rec: 4
    lock_data: 3
    2 rows in set (0.00 sec)

  • root@127.0.0.1   : information_schema 13:40:15> select * from innodb_lock_waits G
    *************************** 1. row ***************************
    requesting_trx_id: 3669D83 ## 請求鎖的事務
    requested_lock_id: 3669D83:49:3:4 ## 請求鎖的鎖ID
    blocking_trx_id: 3669D82 ## 擁有鎖的事務
    blocking_lock_id: 3669D82:49:3:4 ## 擁有鎖的鎖ID
    1 row in set (0.00 sec)