CREATE TABLE test ( id INT NOT NULL AUTO_INCREMENT, name VARC">

mysql死锁怎么复现

来源:这里教程网 时间:2026-02-28 18:12:46 作者:

MySQL 死锁的复现

死锁定义

死锁是指两个或多个进程互相等待,最终导致系统无法继续执行的情况。在 MySQL 中,死锁通常发生在多个进程同时尝试更新同一行或多行数据时。

如何复现死锁

您可以通过以下步骤在 MySQL 中复现死锁:

    创建数据表:

    <code class="sql">CREATE TABLE test (
      id INT NOT NULL AUTO_INCREMENT,
      name VARCHAR(255) NOT NULL,
      PRIMARY KEY (id)
    );</code>

    插入数据:

    <code class="sql">INSERT INTO test (name) VALUES ('John');
    INSERT INTO test (name) VALUES ('Jane');</code>

    开启两个事务:

    <code class="sql">BEGIN;</code>

    获取锁:

    让事务 1 锁定第一行:

    <code class="sql">UPDATE test SET name = 'John Updated' WHERE id = 1;</code>

    让事务 2 锁定第二行:

    <code class="sql">UPDATE test SET name = 'Jane Updated' WHERE id = 2;</code>

    尝试更新同一行:

    让事务 1 尝试更新第二行:

    <code class="sql">UPDATE test SET name = 'John Updated' WHERE id = 2;</code>

    让事务 2 尝试更新第一行:

    <code class="sql">UPDATE test SET name = 'Jane Updated' WHERE id = 1;</code>

    提交事务:

    <code class="sql">COMMIT;</code>

如果一切正常,这两个事务都会成功提交。但是,如果两个事务同时尝试更新同一行,就会发生死锁。

死锁检测

当发生死锁时,MySQL 会检测到并回滚其中一个事务。您可以通过查看错误日志来确认死锁:

<code>  innodb_status: lock wait timeout exceeded; try restart transaction  </code>

避免死锁

为了避免死锁,您可以采取以下措施:

确保事务尽可能短。 始终使用相同的顺序更新表。 使用乐观并发控制,而不是悲观并发控制。

相关推荐