小编典典

MySQL上的join insert / update是原子操作吗?

sql

在Mysql数据库中,每个基于InnoDB的表都启用了Autocommit,带有子查询和/或联接的查询是否是原子的?

例子:

  • INSERT INTO users SELECT (x,y,z) FROM users, comments WHERE users.id = comments.user_id; (加入)

  • UPDATE users, comments SET users.x = x1 WHERE users.age > 30; (加入)

  • UPDATE users, comments SET users.x = x1, comments.y = y1 WHERE users.age > 30; (加入)

  • UPDATE users, comments SET users.x = x1, comments.y = y1 WHERE users.id IN (SELECT id FROM users WHERE age > 30); (子查询)


阅读 579

收藏
2021-05-23

共1个答案

小编典典

我理解您的问题,例如“这些查询中的每个查询本身是否都是原子操作?”。那么答案是“是”。当其他两个答案都说您的所有陈述都不是原子的时,它们是正确的。

数据库中的原子性 仅表示 全部或全部。这 并不意味着
数据的正确性。您的陈述成功与否。它与联接或子查询无关。无论您的数据库是否必须使用内存中或磁盘上的临时表,一条语句就是一条语句。

事务只是告诉您的数据库将多个语句视为一个语句。当其中一条语句失败时,它们全部回滚。

这里一个重要的相关主题是隔离级别。您可能需要阅读这些内容。

编辑(回答评论):

这是正确的。只要它是有效的语句,并且不会发生电源故障或查询可能失败的其他原因,它就可以完成。原子性本身仅保证陈述(一个或多个)是否正在执行。它保证完整性,并且数据没有损坏(因为写操作未完成或其他原因)。
它不能保证您数据的正确性。 给定类似的查询,INSERT INTO foo SELECT MAX(id) + 1 FROM bar;您必须通过设置正确的 隔离级别 来确保您不会得到幻像读取或任何其他内容。

2021-05-23