我最近升级到 mysql 5.7 并观察到频繁的死锁问题。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
Run Code Online (Sandbox Code Playgroud)
插入查询..
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1334 page …Run Code Online (Sandbox Code Playgroud) 我已关闭自动提交功能,并且在阅读后也未从消费方中提交偏移量。
受检查的消费者延迟也保持不变,这确保了偏移量不会被提交。但是问题是,它再次消耗了下一条味精消息。
我如何才能一次又一次地阅读相同的消息。只有提交了先前的偏移量后,我才应该能够阅读下一条消息。请在这里帮助我。