-- 示例代码:模拟 MySQL 死锁
-- 创建两个表 t1 和 t2
CREATE TABLE t1 (id INT PRIMARY KEY, value INT);
CREATE TABLE t2 (id INT PRIMARY KEY, value INT);
-- 插入一些初始数据
INSERT INTO t1 VALUES (1, 100), (2, 200);
INSERT INTO t2 VALUES (1, 300), (2, 400);
-- 会话 1
START TRANSACTION;
-- 锁定 t1 表中的行
UPDATE t1 SET value = value + 50 WHERE id = 1;
-- 会话 2
START TRANSACTION;
-- 锁定 t2 表中的行
UPDATE t2 SET value = value + 50 WHERE id = 1;
-- 会话 1
-- 尝试锁定 t2 表中的行,此时会被阻塞
UPDATE t2 SET value = value + 50 WHERE id = 1;
-- 会话 2
-- 尝试锁定 t1 表中的行,此时会发生死锁
UPDATE t1 SET value = value + 50 WHERE id = 1;
-- 一个会话将被选为死锁受害者,事务回滚
在这个示例中,我们创建了两个表 t1
和 t2
,并在每个表中插入了一些初始数据。然后通过两个不同的会话(Session 1 和 Session 2)来模拟死锁的情况。
t1
表中的某一行。t2
表中的某一行。t2
表中的行,但由于 会话 2 已经锁定了该行,因此 会话 1 被阻塞。t1
表中的行,但由于 会话 1 已经锁定了该行,因此 会话 2 也被阻塞。此时,两个会话都在等待对方释放锁,形成了死锁。MySQL 的死锁检测机制会自动选择其中一个会话作为“死锁受害者”,并回滚其事务以解除死锁。
上一篇:mysql的ifnull
下一篇:mysql删除库的命令
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站