本文是以拣货系统的一次死锁错误为背景,介绍发现问题到解决问题的过程。
发现死锁问题
查看应用日志
发现有大量的error信息,仔细查看后发现大部分都是死锁错误。由于日志过多,之前的错误日志已经刷没了,但是可以通过mysql status查看最后一次死锁快照。
查看Mysql statis
status可以查看到MySQL服务的很多状态,如事务数、文件I/O、日志大小、缓存区等。我们重点关注“LATEST DETECTED DEADLOCK”部分,这部分记录了数据库的最后一次死锁发生的时间和事务快照。建议在发现死锁的时候打开“innodb_print_all_deadlocks”参数,记录所有死锁发生的情况。
(查看status.txt文件 SHOW ENGINE INNODB STATUS)
------------------------
LATEST DETECTED DEADLOCK
------------------------
171130 10:14:44
*** (1) TRANSACTION:
TRANSACTION 25AFDEA1, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1
MySQL thread id 23859938, OS thread handle 0x7f39202ec700, query id 1639722385 10.187.54.140 o2o_pick_good_rw Updating
UPDATE picking_list_53
SET pick_status = 4,picking_end_time = '2017-11-30 10:14:44',update_pin = 'system'
WHERE id = 54700
AND station_no = '11702453'
AND pick_status in (2,3)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2109 page no 767