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引擎,我不知道答案是什么。)
我对 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引擎,我不知道答案是什么。)