我最近升级到mysql 5.7,发现经常出现死锁问题.在5.7中是否有任何与锁定相关的变化?



我最近升级到mysql 5.7,发现经常出现死锁问题。是否有任何与锁定相关的更改,因为我以前没有遇到过这个问题。

我有一个名为retry_records的简单表,其中自动递增的id作为主键,列unique_reference作为唯一索引和另外两个列。这个表在全多线程环境中使用,其中一段代码从这个表中选择n条记录,处理数据并在处理失败的情况下更新这个表,另一段代码从表中删除一些处理过的记录,另一段代码在这个表中插入一条新记录。在任何查询中都没有join,除了select,没有批量插入,批量更新,批量删除。所有的更新/删除/插入事务都有一条语句。即使这样,我也观察到插入时的死锁。下面是日志:

------------------------
LATEST DETECTED DEADLOCK
------------------------
2016-09-22 13:05:09 0x7f3f427e0700
*** (1) TRANSACTION:
TRANSACTION 39420432534, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 37503, OS thread handle 139917976340224, query id 1695822465

Insert查询. .

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1334 page no 1726952 n bits 312 index id of table `database_name`.`table_name` trx id 39420432534 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;
*** (2) TRANSACTION:
TRANSACTION 39420432524, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
6 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 1
MySQL thread id 37494, OS thread handle 139909675222784, query id 1695822438

另一个插入查询…

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1334 page no 1726952 n bits 312 index id of table

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1334 page no 1726952 n bits 312 index id of table
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

我也遇到过类似的问题。从5.7开始,有一个新的参数名称innodb_deadlock_detect

该选项用于禁用死锁检测。关于高并发性系统中,当线程众多时,死锁检测可能会导致速度变慢等待相同的锁。有时,禁用它可能更有效死锁检测并依赖于innodb_lock_wait_timeout设置用于发生死锁时的事务回滚。

禁用它可以提高性能并减少死锁问题。

相关内容

  • 没有找到相关文章

最新更新