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

mysql 死锁

作者:恐怖眼神   发布日期:2025-04-13   浏览:101

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

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

解释说明:

在这个示例中,我们创建了两个表 t1t2,并在每个表中插入了一条记录。然后通过两个会话来模拟死锁的情况。

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

此时,两个会话都在等待对方释放锁,形成了死锁。MySQL 的 InnoDB 存储引擎会检测到这种情况,并选择其中一个会话作为“死锁受害者”,自动回滚该会话的事务以解除死锁。

上一篇:mysql concat_ws

下一篇: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 中文站