我希望锁定MySQL中的表,以便其他进程在锁定表时无法访问该表。
MySQL文档表示有关LOCK TABLES命令的内容:
MySQL使客户端会话能够显式地获取表锁,以便与其他会话协作访问表,或者在会话需要独占访问时防止其他会话修改表。
很好,所以我试着做
mysql>LOCK TABLES foo WRITE;我可以检查其他进程是否能够访问foo。
问题是我无法访问其他表。文件上说:
需要锁的会话必须在单个锁表语句中获取所需的所有锁。当所获得的锁被持有时,会话只能访问已锁定的表。
这很奇怪。为什么我还要锁其他桌子。我只想阻止其他人访问foo。我不想锁定其他任何东西,我只想正常地访问其他表。
如何锁定一个表而不更改其他表的任何内容??
发布于 2014-07-18 22:21:53
由于此LOCK TABLES特性的行为方式(在我看来很奇怪),处理此问题的一种方法是不将此过程用于其他任何事情。也就是说,生成一个进程来锁定这个表,访问这个表,并解锁它。使用其他进程访问其他表--不能访问其他表的限制本身并不是全局的,它仅限于该一个进程。
当然,在那之后,我仍然必须同步我刚刚创建的多个进程之间的控制流。但是这不是MYSql,我可以使用我使用的任何编程语言,它具有这样的功能。
我想另一种方法是创建一个新的数据库,并将这个表放到新的数据库中。
发布于 2014-07-18 22:54:28
锁表不依赖存储引擎,因为它是由存储引擎层之上的SQL层处理的。行锁在InnoDB存储引擎中处理。
很抱歉MySQL的架构太复杂了。这是支持多个存储引擎的优点和缺点。大多数RDBMS产品不具备此功能,因此所有存储功能似乎都更集成到其他功能中。在MySQL中,存储引擎的代码独立于与存储无关的代码,某些特性可以用特定的存储引擎实现。
事务就是一个很好的例子。InnoDB支持事务,这定义了InnoDB锁定的范围。当事务结束时,所有InnoDB管理的锁都会被释放。
默认情况下,MySQL客户端工具和大多数编程接口在“自动提交”模式下工作。因此,每个SQL语句都启动一个新事务,并在查询结束时自动提交它。
但您可以控制事务何时开始和完成。请参阅http://dev.mysql.com/doc/refman/5.6/en/commit.html
https://stackoverflow.com/questions/24834014
复制相似问题