-- 示例代码:模拟 MySQL 死锁
-- 创建两个表 t1 和 t2
CREATE TABLE t1 (
id INT PRIMARY KEY,
value INT
);
CREATE TABLE t2 (
id INT PRIMARY KEY,
value INT
);
-- 插入一些初始数据
INSERT INTO t1 (id, value) VALUES (1, 100);
INSERT INTO t2 (id, value) VALUES (1, 200);
-- 会话 1
BEGIN;
-- 会话 1 锁定 t1 表中的行
UPDATE t1 SET value = value + 10 WHERE id = 1;
-- 会话 2
BEGIN;
-- 会话 2 锁定 t2 表中的行
UPDATE t2 SET value = value + 20 WHERE id = 1;
-- 会话 1 尝试锁定 t2 表中的行(此时会被阻塞)
UPDATE t2 SET value = value + 10 WHERE id = 1;
-- 会话 2 尝试锁定 t1 表中的行(此时也会被阻塞)
UPDATE t1 SET value = value + 20 WHERE id = 1;
-- 其中一个会话将会被选为死锁受害者,并回滚事务
在这个示例中,我们创建了两个表 t1
和 t2
,并在每个表中插入了一条记录。然后通过两个会话来模拟死锁的情况。
t1
表中的行。t2
表中的行。t2
表中的行,但由于 会话 2 已经锁定了该行,所以它会被阻塞。t1
表中的行,但由于 会话 1 已经锁定了该行,所以它也会被阻塞。此时,两个会话都在等待对方释放锁,形成了死锁。MySQL 的 InnoDB 存储引擎会检测到这种情况,并选择其中一个会话作为“死锁受害者”,自动回滚该会话的事务以解除死锁。
上一篇:mysql concat_ws
下一篇:mysql保留两位小数
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站