概念
死锁是指两个或多个事务在同一资源上互相占用,并请求加锁时,而导致的恶性循环现象.
当多个事务以不同顺序试图加锁同一资源时,就会产生死锁.
任何时间,多个事务同时加锁一个资源,一定产生死锁.INNODB引擎处理死锁的方式
首先INNODB可以预知循环相关性,并立刻返回错误.其次INNODB处理死锁的方法是,回滚拥有最少排他行级锁的事务.(估算)死锁现象
数据冲突导致;
存储引擎的工作方式导致.
问题分析
查看死锁信息
分析表结构
重写查询语句,查看执行计划
附:
死锁信息
登录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)个事务 ...