Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

mysql deadlock

作者:冷血杀手   发布日期:2025-06-17   浏览:92

-- 示例代码:模拟 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;

-- 一个会话将被选为死锁受害者,事务回滚

解释说明:

在这个示例中,我们创建了两个表 t1t2,并在每个表中插入了一些初始数据。然后通过两个不同的会话(Session 1 和 Session 2)来模拟死锁的情况。

  1. 会话 1 开始一个事务并锁定 t1 表中的某一行。
  2. 会话 2 开始一个事务并锁定 t2 表中的某一行。
  3. 会话 1 尝试锁定 t2 表中的行,但由于 会话 2 已经锁定了该行,因此 会话 1 被阻塞。
  4. 会话 2 尝试锁定 t1 表中的行,但由于 会话 1 已经锁定了该行,因此 会话 2 也被阻塞。

此时,两个会话都在等待对方释放锁,形成了死锁。MySQL 的死锁检测机制会自动选择其中一个会话作为“死锁受害者”,并回滚其事务以解除死锁。

上一篇:mysql的ifnull

下一篇:mysql删除库的命令

大家都在看

mysqlavg函数保留小数

mysql经纬度距离计算

存储过程mysql

mysql with语句

mysql时间加减

brew 启动mysql

unsigned在mysql中是什么意思

mysql 插入更新

mysql.user

python mysql update

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站