【问题标题】:MySQL/MariaDB lock over previous lockMySQL/MariaDB 锁定前一个锁定
【发布时间】:2015-11-09 05:16:48
【问题描述】:

我对表有以下完全锁定:

LOCK TABLES t1 WRITE, t2 WRITE;

我想稍后再向锁添加一张表(在同一个会话中)。所以我执行

LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE;

这似乎工作得很好。我的问题是:这安全吗?我的意思是,数据库内部发生了什么?它是否先解锁 t1,t2 表,然后立即锁定 t1,t2,t3,从而可能在三个表实际锁定之前对任何表进行不必要的访问?

我正在使用 MariaDB,我正在阅读 documentation,但在那里没有找到答案。

【问题讨论】:

    标签: mysql multithreading locking mariadb


    【解决方案1】:

    LOCK TABLES 用于 MyISAM 表。如果您使用 InnoDB,请切换到 BEGIN...COMMIT 并了解“事务”,不要使用 LOCK

    使用LOCK TABLES 时,您有一个 机会锁定所有您需要的表。在您的示例中,将在获取 3 个表上的锁之前释放 2 个表上的锁。在此期间,其他一些连接可能会抢占 t1 和/或 t2。这可能会打乱您的设计。

    由于 MariaDB 基于 MySQL,this documentation 提供了明确的答案:

    如果会话发出 LOCK TABLES 语句来获取锁,而 已经持有锁,其现有锁被隐式释放 在授予新锁之前。

    (如果你使用的是Aria引擎,我不知道答案是什么。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多