【问题标题】:does MySQL executes single statement atomically?MySQL 是否以原子方式执行单个语句?
【发布时间】:2021-12-14 22:44:05
【问题描述】:

说,我有 2 个连接,它们正在执行以下代码。 会不会导致死锁?

connection 1-> lock tables A write, B write;
connection 2-> lock tables B write, A write;

【问题讨论】:

    标签: mysql sql database-deadlocks


    【解决方案1】:

    您可以通过在两个连接中使用LOCK TABLES A WRITE, B WRITE; 来消除死锁的风险。这是原子的,所以第二个连接会等待。

    如果不使用LOCK TABLES,则存在死锁风险。

    在某些情况下,即使是单个 SQL 语句也可能死锁。我们在我目前的工作场所经常看到这种情况,例如,如果一个表有多个主键或唯一键。例如:

    CREATE TABLE MyTable (
      id INT AUTO_INCREMENT PRIMARY KEY,
      x INT,
      UNIQUE KEY (x)
    );
    

    MySQL 似乎有一个允许死锁的设计缺陷,因为它不是一个语句获取多个唯一键上的锁的原子。

    【讨论】:

    • 如果需要的话,比如LOCK TABLES A READ, B WRITE, C WRITE;另外,没有得到多主键的例子,请你解释一下。
    • 锁表A、B写; -> 给出错误。错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“,类别写入”附近使用正确的语法
    • 我在上面的语法中犯了一个错误(现已编辑修复)。每个表名后面必须跟WRITEREAD。阅读dev.mysql.com/doc/refman/8.0/en/lock-tables.html 了解语法的详细信息。
    • 至于多个键:我在上面展示了一个示例。同时具有主键和唯一键的表容易发生死锁,因为一个会话锁定主键,然后第二个会话锁定唯一键,然后第一个会话等待唯一键,然后第二个会话等待首要的关键。不幸的是,MySQL 不会自动获取锁。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2011-12-05
    • 1970-01-01
    • 2010-09-29
    • 2010-11-08
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多