在MySQL上加入insert/update是一个原子操作吗?

Dam*_*ati 5 mysql sql concurrency locking atomicity

在一个Mysql数据库中,每个基于InnoDB的表都启用了自动提交,子查询和/或连接的查询是原子的吗?

例子:

  • 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); (子查询)

fan*_*nts 8

我理解你的问题是"每个查询本身都是一个原子操作吗?".然后答案是肯定的.另外两个答案是对的,当他们说你所有的陈述都不是原子的.

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

事务只是告诉您的数据库将多个语句视为一个语句.当其中一个语句失败时,所有语句都会回滚.

这里一个重要的相关主题是隔离级别.您可能想要了解这些内容.

编辑(回答评论):

那就对了.只要它是有效的声明并且没有发生电源故障或查询可能失败的其他原因,它就完成了.原子性本身只保证声明是否正在完成.它保证了完整性并且数据没有损坏(导致写入操作没有完成或者某些事情).它不能保证数据的正确性.给定一个查询,INSERT INTO foo SELECT MAX(id) + 1 FROM bar;你必须确保通过设置正确的隔离级别,你不会得到幻像读取或任何东西.