如何实现“mysql 按主键更新也有死锁”

一、整体流程

我们首先来看一下整个过程的流程,可以用如下表格展示步骤:

步骤 操作
1 开启两个事务同时更新同一行数据
2 事务1更新数据,但未提交事务
3 事务2更新相同数据,并提交事务
4 事务1尝试提交事务,发生死锁
5 死锁处理

二、具体操作

1. 准备工作

首先,我们需要创建一个测试表,表结构如下:

CREATE TABLE test_table (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

然后向表中插入一条数据:

INSERT INTO test_table (id, name) VALUES (1, 'test');

2. 开启两个事务同时更新同一行数据

在两个不同的窗口中分别开启两个事务:

-- 事务1
START TRANSACTION;
UPDATE test_table SET name = 'new_test' WHERE id = 1;

-- 事务2
START TRANSACTION;
UPDATE test_table SET name = 'another_test' WHERE id = 1;

3. 提交事务并触发死锁

在第二个事务中提交事务:

COMMIT;

此时尝试在第一个事务中提交事务,就会发生死锁:

COMMIT;

4. 死锁处理

当发生死锁时,MySQL会自动进行死锁检测并选择一个事务进行回滚。可以通过查看innodb_lock_wait_timeout参数来设置等待时间。

三、示例图示

饼状图

pie
    title MySQL死锁情况分布
    "事务1" : 50
    "事务2" : 50

关系图

erDiagram
    test_table {
        INT id
        VARCHAR(50) name
    }

结束语

通过以上操作,我们成功实现了“mysql 按主键更新也有死锁”的效果。希望这篇文章对你有所帮助,如果有任何疑问,欢迎随时与我联系。祝你学习进步!