【问题标题】:Am I locking a table when performing a SELECT on a table?在表上执行 SELECT 时我是否锁定了表?
【发布时间】:2011-12-12 15:55:39
【问题描述】:

这是一个两部分的问题。当我对表执行 SELECT 时,我是否会在 SELECT 运行时锁定该表以防止任何使用?

如果是这样,有什么方法可以在执行 SELECT 语句时不锁定表?我正在使用 MySQL 4.1.20 MyISAM。

更新这里有一个类似的问题Any way to select without causing locking in MySQL?,但答案不适用于 MyISAM

【问题讨论】:

  • 有点切线,但你为什么还在 4.1 上?
  • 之前在这里回答过:[mysql nolock quivelant][1] [1]: stackoverflow.com/questions/917640/…
  • 锁是邪恶的,通常完全没有必要。
  • @Jacque 虽然这是一个很好的解决办法,但该问题的答案不适用于 MyISAM
  • @DavidLively 锁用于保护数据完整性。但是,就我而言,我不在乎我的数据是否过时。我想做所谓的“脏读”。

标签: mysql performance myisam


【解决方案1】:

是的,对于 MyISAM 表,选择锁定表以进行插入/更新。然而,几个选择可以同时运行(即它应用一个读锁)。如果表中间没有空闲空间,插入操作会将数据添加到(内部)存储的末尾,但这些插入操作仍然可以与选择操作同时运行。

更多信息here。请注意,MyISAM 和 InnoDB 在这方面的工作方式非常不同。

【讨论】:

  • 什么是防止锁定的方法?如何进行脏读?
  • @dev.e.loper 你切换到innodb并将隔离级别设置为“read uncommitted”。
【解决方案2】:

有表锁定和行锁定。我建议您阅读数据库引擎 MyISAM with Table LockingInnoDB Row Locking

【讨论】:

    【解决方案3】:

    想一想:当您执行 SELECT 时,您是否更改了任何表格单元格?如果没有,则无需锁定表,而 MySQL 不需要。表锁定必须在 UPDATE 时发生,而不是在 SELECT 时发生。

    【讨论】:

    • MyISAM 在执行选择时对表设置表级读锁,InnoDB 应用更细粒度的锁定。但关键是,即使选择也会应用锁定,尽管对于某些存储引擎,它取决于隔离级别。 (而其他 DB 则走不同的路线,使用 MVCC 进一步避免锁定)
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多