哪个表将被此查询锁定?

时间:2009-10-09 18:59:43

标签: mysql innodb myisam

我正在使用下面的查询在两个表之间迁移数据。我有表锁定问题,所以我正在考虑将表引擎从MyISAM更改为InnoDB。我需要哪些表格?我正在写的表,或者我写的表和我正在阅读的表?

INSERT INTO table1 (
  field1, field2, field2
)
SELECT
  field1, field2,
  (
    SELECT
      temp.field4
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
    ORDER BY
      temp.something DESC
    LIMIT
      1
  ) + 1 AS field3
FROM
  table2
WHERE
  NOT EXISTS (
    SELECT
      1
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
  )

2 个答案:

答案 0 :(得分:3)

锁定什么

这取决于。如果要确保在执行更新时不能写入新数据,则应锁定两个表。如果只是写作问题,那么只需将表锁定在您正在进行更新的位置。

常见的误解

错误,MyISAM无法执行锁定。它只是MyISAM无法进行的行级锁定。 MyISAM完全能够锁定表格。

根据以下列表做出决定。

决策助手

您的表格是否会被插入,删除和更新,而不是选择它? => InnoDB的

您需要全文搜索
=>的MyISAM

您更喜欢/需要明确的外键约束
=> InnoDB的

磁盘空间或内存是一个问题吗? =>的MyISAM

怀疑?
=> MyISAM的

没有胜利者。

答案 1 :(得分:0)

表1应该被锁定。有人可以证实吗?

我只使用Innodb。我忘记了myisam的作用!

无论哪种方式,你应该把所有东西切换到Innodb。这些天Innodb无论如何都快速阅读。