正常情况下,死锁发生时,权重最小的连接将被kill并回滚。但是为了找出语句来优化,启用可启用死锁将死锁信息记录下来。
#step 1:窗口一 mysql> start transaction; mysql> update aa set name='aaa' where id = 1; #step 2:窗口二 mysql> start transaction; mysql> update bb set name='bbb' where id = 1; #step 3:窗口一 mysql> update bb set name='bbb';
#step 4:窗口三 #是否自动提交 mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ #查看当前连接 mysql> show processlist; mysql> show full processlist; mysql> SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; +----+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+-------+------------------+ | 4 | root | localhost | test | Sleep | 244 | | NULL | | 5 | root | localhost | test | Sleep | 111 | | NULL | | 6 | root | localhost | NULL | Query | 0 | init | show processlist | +----+------+-----------+------+---------+------+-------+------------------+ #查看当前正在被锁的事务(锁请求超时后则查不到) mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; +------------------+-------------+-----------+-----------+-------------+-----------------+------------+-----------+----------+----------------+ | lock_id | lock_trx_id | lock_mode | lock_type | lock_table | lock_index | lock_space | lock_page | lock_rec | lock_data | +------------------+-------------+-----------+-----------+-------------+-----------------+------------+-----------+----------+----------------+ | 130718495:65:3:4 | 130718495 | X | RECORD | `test`.`bb` | GEN_CLUST_INDEX | 65 | 3 | 4 | 0x000000000300 | | 130718496:65:3:4 | 130718496 | X | RECORD | `test`.`bb` | GEN_CLUST_INDEX | 65 | 3 | 4 | 0x000000000300 | +------------------+-------------+-----------+-----------+-------------+-----------------+------------+-----------+----------+----------------+ #查看当前等待锁的事务(锁请求超时后则查不到) mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; +-------------------+-------------------+-----------------+------------------+ | requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id | +-------------------+-------------------+-----------------+------------------+ | 130718499 | 130718499:65:3:4 | 130718500 | 130718500:65:3:4 | +-------------------+-------------------+-----------------+------------------+ #查看当前未提交的事务(如果死锁等待超时,事务可能还没有关闭) mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; +--------------------------------------------------------------------------------------------------------+ | trx_id | trx_state | trx_started | trx_requested_lock_id | trx_wait_started | trx_weight | +-----------+-----------+---------------------+-----------------------+---------------------+------------+ | 130718500 | RUNNING | 2018-03-12 09:28:10 | NULL | NULL | 3 | | 130718499 | LOCK WAIT | 2018-03-12 09:27:59 | 130718499:65:3:4 | 2018-03-12 09:32:48 | 5 | ========================================================================================================== | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | +---------------------+---------------------------------------+---------------------+-------------------+ | 4 | NULL | NULL | 0 | | 5 | update bb set name='bbb' | starting index read | 1 | ========================================================================================================= | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | +-------------------+------------------+-----------------------+-----------------+-------------------+ | 0 | 2 | 360 | 3 | 1 | | 1 | 4 | 1184 | 4 |<span>本文来源gaodai#ma#com搞*!代#%^码$网*</span> 1 | =========================================================================================================================== | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | +-------------------------+---------------------+-------------------+------------------------+----------------------------+ | 0 | REPEATABLE READ | 1 | 1 | NULL | | 0 | REPEATABLE READ | 1 | 1 | NULL | =========================================================================================================================== | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking | +---------------------------+---------------------------+------------------+----------------------------+ | 0 | 10000 | 0 | 0 | | 0 | 10000 | 0 | 0 | +---------------------------+---------------------------+------------------+----------------------------+ #查看正在被访问的表 mysql> show OPEN TABLES where In_use > 0; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | test | bb | 1 | 0 | +----------+-------+--------+-------------+
#step 3:窗口一 (若第三步中锁请求太久,则出现锁超时而终止执行) mysql> update bb set name='bbb'; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction #"窗口一" 锁请求超时前,执行第五步,使死锁产生,则该连接 "窗口二" 执行终止,"窗口一" 顺利执行 #step 5:窗口二 mysql> update aa set name='aa'; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction