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

mysql死锁的原因和处理方法

作者:昂首向前走,   发布日期:2025-03-29   浏览:113

-- 示例代码:模拟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;
UPDATE t1 SET value = value + 1 WHERE id = 1;

-- 会话 2
BEGIN;
UPDATE t2 SET value = value + 1 WHERE id = 1;

-- 会话 1
UPDATE t2 SET value = value + 1 WHERE id = 1; -- 等待会话 2 释放锁

-- 会话 2
UPDATE t1 SET value = value + 1 WHERE id = 1; -- 等待会话 1 释放锁

-- 此时会发生死锁,MySQL 会自动检测到并回滚其中一个事务

-- 处理死锁的方法之一是捕获异常并重试事务
BEGIN;
START TRANSACTION;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    ROLLBACK;
    -- 可以在这里添加日志记录或重试逻辑
END;
UPDATE t1 SET value = value + 1 WHERE id = 1;
UPDATE t2 SET value = value + 1 WHERE id = 1;
COMMIT;

解释说明:

  1. 创建表和插入数据

    • 创建了两个简单的表 t1t2,每个表有一个主键 id 和一个整数列 value
    • 插入了一些初始数据以便进行更新操作。
  2. 模拟死锁场景

    • 使用两个会话(Session 1 和 Session 2)来模拟死锁。每个会话开始一个事务,并分别对不同的表进行更新。
    • 当两个会话试图同时锁定对方已经持有的资源时,就会发生死锁。MySQL 会自动检测到死锁并回滚其中一个事务。
  3. 处理死锁的方法

    • 捕获异常并重试事务是一个常见的处理方法。通过声明一个异常处理器(DECLARE EXIT HANDLER FOR SQLEXCEPTION),可以在遇到死锁时回滚事务,并根据需要进行重试或其他处理逻辑。

上一篇:mysqlcheck怎么用

下一篇:mysql删除表中所有数据

大家都在看

mysqlavg函数保留小数

mysql显示表内容

mysql经纬度距离计算

存储过程mysql

mysql with语句

mysql时间加减

brew 启动mysql

unsigned在mysql中是什么意思

mysql 插入更新

mysql代码

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

Laravel 中文站