死锁

  1. 概念
    死锁是指两个或多个事务在同一资源上互相占用,并请求加锁时,而导致的恶性循环现象.
    当多个事务以不同顺序试图加锁同一资源时,就会产生死锁.
    任何时间,多个事务同时加锁一个资源,一定产生死锁.

  2. INNODB引擎处理死锁的方式
    首先INNODB可以预知循环相关性,并立刻返回错误.其次INNODB处理死锁的方法是,回滚拥有最少排他行级锁的事务.(估算)

  3. 死锁现象
    数据冲突导致;
    存储引擎的工作方式导致.

问题分析


  1. 查看死锁信息

  2. 分析表结构

  3. 重写查询语句,查看执行计划

附:

死锁信息



登录MySQL执行SHOW ENGINE INNODB STATUS\G命令

...
LATEST DETECTED DEADLOCK
------------------------
121029 14:46:44
-- 死锁发生的时间

*** (1) TRANSACTION:
TRANSACTION 1B02B0FAC, ACTIVE 5 sec fetching rows
mysql tables in use 1, locked 1
LOCK WAIT 86 lock struct(s), heap size 14776, 11642 row lock(s), undo log entries 1436
MySQL thread id 51989134, OS thread handle 0x6482b940, query id 37321665747 ......
<sql-1>
-- 第(1)个事务信息

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 17689 page no 1606 n bits 760 ......
lock_mode X waiting
-- 第(1)个事务等待的锁

*** (2) TRANSACTION:
TRANSACTION 1B02B2776, ACTIVE 0 sec fetching rows, thread declared inside InnoDB 500
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1248, 11 row lock(s)
MySQL thread id 51984598, OS thread handle 0x6d9a8940, query id 37321665253 ......
<sql-2>
-- 第(2)个事务状态

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 17689 page no 1606 n bits 760 index ......
-- 第(2)个事务持有的锁:该锁就是第(1)个事务在等待的.

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 17689 page no 1606 n bits 760 index ......
-- 第(2)个事务等待的锁.

*** WE ROLL BACK TRANSACTION (2)
-- 回滚了第(2)个事务
...


你可能感兴趣的:(计划,资源,信息,tables,相关性)