【问题标题】:Why mysql add a read lock to myisam engine table when select data?为什么mysql在选择数据时会向myisam引擎表添加读锁?
【发布时间】:2017-08-14 07:04:19
【问题描述】:

为什么mysql在选择数据时要给myisam引擎表加读锁?

官方手册上只提到innodb有一个默认的隔离。而且我们知道myisam引擎不支持事务。但是为什么mysql要给选择表加读锁呢?

【问题讨论】:

    标签: mysql locking myisam


    【解决方案1】:

    如果查询正在读取表时修改了表,则读取查询可能会返回不正确的结果。为了防止这种情况,MyISAM 使用 lock* 来防止在任何其他线程正在从该表读取时对表进行写入。不过,此锁不会阻止其他读取查询 - 任意数量的线程都可以共享该锁。

    当查询写入表时,表也会被锁定。这使用不同类型的锁来防止在该表上发生任何其他写入或读取

    【讨论】:

    • 谢谢。但是我在官方手册上找不到关于读锁(查询数据时)的信息。它是sql标准吗?
    • SQL 标准没有讨论实现的怪癖,比如 MyISAM 需要表锁来发挥它的黑魔法。老实说,由于这样的事情,MyISAM 真的不值得使用,它是一个对 MySQL 1.0 来说已经足够好的引擎,但按照现代标准来说已经过时了。尽可能使用 InnoDB。它支持事务,有一个日志可以在服务器崩溃的情况下安全回滚,等等。
    • 嗯,你的意思是我们找不到关于myisam读锁的官方上下文(即使myisam引擎的信息也很少)。我应该放弃使用myisam引擎。
    • 也就是说mysql myisam会为读操作设置一个talble lock(读锁)。“select”是一个读操作,所以mysql会在myisam上设置读锁(作为表级锁)表。所以其他写操作应该等待它完成,因为手册说“如果表上没有锁”。就这样?
    猜你喜欢
    • 2011-12-20
    • 2012-10-09
    • 2013-12-09
    • 2014-02-26
    • 2014-05-11
    • 2013-04-25
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多