表结构如下
CREATE TABLE `system_proxy` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`ip` varchar(46) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
`port` int unsigned NOT NULL DEFAULT '0',
`status` tinyint unsigned NOT NULL DEFAULT '0',
`holder` int unsigned NOT NULL DEFAULT '0',
`update_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `unique_ip_port` (`ip`,`port`) USING BTREE,
KEY `index_holder_status` (`status`,`holder`) USING BTREE
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
show engine innodb status
详细内容在这里 https://paste.ubuntu.com/p/7ZyjCpTDrX/
业务上,多线程会并发进行如下两个 sql 的更新操作,观察上面的日志,应该就是造成概率性发生死锁的原因。
(我不太会看这个日志。。求大腿讲解以及解决方案)
事务 1 update system_proxy set status = 3 where id = ?
事务 2 update system_proxy set status = 1, holder = 3 where status = 0 limit 1
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.