MySQL/MariaDB 锁定之前的锁定

MySQL/MariaDB lock over previous lock

我对 tables 进行了以下完全锁定:

LOCK TABLES t1 WRITE, t2 WRITE;

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

LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE;

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

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

LOCK TABLES 用于 MyISAM 表。如果您使用的是 InnoDB,请切换到 BEGIN...COMMIT 并了解 "transactions",不要使用 LOCK

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

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

If a session issues a LOCK TABLES statement to acquire a lock while already holding locks, its existing locks are released implicitly before the new locks are granted.

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