首页 > 解决方案 > 操作一张表时出现意外死锁

问题描述

最近我在产品环境上遇到了一些意想不到的僵局。场景很简单:假设我们有一张桌子

CREATE TABLE customer
(
    id bigint(20) auto_increment,
    customer_id varchar(255),
    name varchar(255),
    update_time datetime,
    primary key (id),
    unique key(customer_id)
)

假设我在这张表中有一条记录

(0, '74597229-fef2-11ea-994a-6c92bf29c398', 'someCustomer', '1970-01-01 00:00:00')

然后我在下面进行了一些操作:

start transaction; -- 0
update customer set name = 'deadlockTest' where customer_id = '74597229-fef2-11ea-994a-6c92bf29c398'; -- 1

delete from customer where customer_id = '74597229-fef2-11ea-994a-6c92bf29c398'; --3

commit; -- 5
update customer set update_time = now() where customer_id in ('74597229-fef2-11ea-994a-6c92bf29c398'); -- 2
update customer set update_time = now() where customer_id in ('74597229-fef2-11ea-994a-6c92bf29c398'); -- 4

'--'后面的数字表示操作顺序,

一旦我执行第 5 步(提交),第 4 步将引发死锁异常

用'```'包围的代码块表示一个新线程(或无论如何都是一个新窗口)

这真是不可思议

标签: mysqldeadlock

解决方案


推荐阅读