首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MySQL中锁定表,但不影响其他表

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

Stack Overflow用户
提问于 2014-07-18 21:24:33
回答 2查看 1.1K关注 0票数 3

我希望锁定MySQL中的表,以便其他进程在锁定表时无法访问该表。

MySQL文档表示有关LOCK TABLES命令的内容:

MySQL使客户端会话能够显式地获取表锁,以便与其他会话协作访问表,或者在会话需要独占访问时防止其他会话修改表。

很好,所以我试着做

代码语言:javascript
运行
复制
mysql>LOCK TABLES foo WRITE;

我可以检查其他进程是否能够访问foo

问题是我无法访问其他表。文件上说:

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

这很奇怪。为什么我还要锁其他桌子。我只想阻止其他人访问foo。我不想锁定其他任何东西,我只想正常地访问其他表。

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

EN

回答 2

Stack Overflow用户

发布于 2014-07-18 22:21:53

由于此LOCK TABLES特性的行为方式(在我看来很奇怪),处理此问题的一种方法是不将此过程用于其他任何事情。也就是说,生成一个进程来锁定这个表,访问这个表,并解锁它。使用其他进程访问其他表--不能访问其他表的限制本身并不是全局的,它仅限于该一个进程。

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

我想另一种方法是创建一个新的数据库,并将这个表放到新的数据库中。

票数 0
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24834014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档