如何在MySQL中锁定表但不影响其他表

时间:2014-07-18 21:24:34

标签: mysql

我想在MySQL中锁定一个表,以便其他进程在锁定时无法访问该表。

MySQL文档说明了LOCK TABLES命令:

MySQL允许客户端会话显式获取表锁,以便与其他会话协作以访问表,或者防止其他会话在会话需要对其进行独占访问期间修改表。

好,所以我尝试做

mysql>LOCK TABLES foo WRITE;

我可以检查其他进程是否无法访问foo

问题是 I 无法访问其他表。文档说:

需要锁定的会话必须在单个LOCK TABLES语句中获取所需的所有锁定。当保持这样获得的锁时,会话只能访问锁定的表

这很奇怪。为什么我被迫也锁定其他表。我只想阻止其他人访问foo。我不想锁定任何其他内容,我只是想正常访问其他表。

如何锁定一个表而不更改其他表的任何内容?

2 个答案:

答案 0 :(得分:0)

由于这个LOCK TABLES功能在这方面(我认为很奇怪)的方式,处理这种情况的一种方法,不是将此过程用于其他任何事情。也就是说,生成一个进程只是为了锁定该表,访问该表并解锁它。使用其他进程访问其他表 - 不能访问其他表的限制不是全局,它只限于那个进程。

在那之后,当然,我仍然需要在我刚刚创建的多个进程之间同步控制流。但那是MYSql,我可以使用我正在使用的任何编程语言,它具有这样的功能。

我想另一种方法是创建一个新数据库并将该表放在新数据库中。

答案 1 :(得分:0)

LOCK TABLES没有存储引擎依赖性,因为它由存储引擎层上方的SQL层处理。行锁在InnoDB存储引擎内处理。

很抱歉MySQL的架构非常复杂。这是支持多个存储引擎的优点和缺点。大多数RDBMS产品没有此功能,因此所有存储功能似乎都更加集成到其余功能中。在MySQL中,存储引擎的代码独立于与存储无关的代码,某些功能可以通过某些存储引擎实现。

交易就是一个很好的例子。 InnoDB支持事务,这定义了InnoDB锁定的范围。当事务结束时,所有InnoDB管理的锁都会被释放。

默认情况下,MySQL客户端工具和大多数编程接口以“自动提交”模式运行。因此,每个SQL语句都会启动一个新事务,并在查询完成时自动提交它。

但您可以控制交易何时开始和结束。见http://dev.mysql.com/doc/refman/5.6/en/commit.html