当前位置:  开发笔记 > 后端 > 正文

如果您尝试更新正在查询的表,MySQL会怎么做?

如何解决《如果您尝试更新正在查询的表,MySQL会怎么做?》经验,为你挑选了1个好方法。

我有一个非常慢的查询,我需要不时在MySQL数据库上运行.

我发现在查询完成之前,会阻止尝试更新正在查询的表.

我想这是有道理的,否则查询的结果可能会不一致,但它对我来说并不理想,因为查询的重要性远低于更新.

所以我的问题实际上有两个部分:

    出于好奇,MySQL在这种情况下究竟做了什么?它是否在查询期间锁定表格?或者在更新之前尝试锁定它?

    有没有办法让慢查询不阻塞?我猜选项可能是:

    需要更新时终止查询.

    在更新发生之前,对表的副本运行查询

    只是让查询出错.

有没有人对此有任何想法?



1> 小智..:

听起来您正在使用MyISAM表,它使用表级锁定.在这种情况下,SELECT将在表上设置共享锁.然后UPDATE将尝试请求独占锁定和阻塞,并等待SELECT完成.完成后,UPDATE将正常运行.

MyISAM锁定

如果您切换到InnoDB,那么您的SELECT默认情况下不会设置锁定.没有必要像其他人推荐的那样更改事务隔离级别(InnoDB默认可重复读取,并且不会为SELECT设置锁定).UPDATE将能够同时运行.InnoDB使用的多版本与Oracle处理这种情况的方式非常相似.SELECTs设置锁定的唯一时间是,如果您在可序列化的事务隔离级别中运行,则查询具有FOR UPDATE/LOCK IN SHARE MODE选项,或者它是某种写入语句的一部分(例如INSERT. ..SELECT)并且您正在使用基于语句的二进制日志记录.

InnoDB锁定

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有