MySQL上的join insert / update是原子操作吗?
技术问答
191 人阅读
|
0 人回复
|
2023-09-12
|
在Mysql在数据库中,每个基础InnoDB所有的表都启用了Autocommit,有子查询和/或连接的查询是否为原子?
, R' @. \8 n6 d1 Z( X! H例子:; v) G; o( k% c9 i8 G/ w( Z
INSERT INTO users SELECT (x,y,z) FROM users,comments WHERE users.id = comments.user_id; (加入)
; N7 N/ _) W u7 b' {* {" C. ~4 yUPDATE users,comments SET users.x = x1 WHERE users.age > 30; (加入)
8 }" T0 B0 `8 m, @ }) uUPDATE users,comments SET users.x = x1,comments.y = y1 WHERE users.age > 30; (加入)4 ]1 Y) D+ x# g: v( q
UPDATE users,comments SET users.x = x1,comments.y = y1 WHERE users.id IN (SELECT id FROM users WHERE age > 30); (子查询)" t8 S& v& o8 @* A$ m- H; z8 q
$ l) F2 O- [2 ? {. b6 Q
解决方案:
, v5 S6 s0 z z6 n1 v# }7 I8 S* A 我理解你的问题,比如这些查询中的每一个查询都是原子操作吗?。然后答案是是。当其他两个答案都说你所有的陈述都不是原子时,它们是正确的。
( S! K }2 M7 E原子性 在数据库中仅表示 全部或全部。这 并不意味着2 b" P1 I! r; T5 @1 s
数据的正确性。你的陈述是否成功。它与连接或子查询无关。无论您的数据库是否必须使用内存或磁盘上的临时表,一个句子都是一个句子。" M8 _$ @) Y0 I# p9 N" `; H _1 _: e
事务只是告诉你,数据库将多个句子视为一个句子。当其中一个句子失败时,它们都会回滚。4 F& p4 n: H3 P; i& j
这里的一个重要主题是隔离级别。您可能需要阅读这些内容。
( ^" X; ]2 [1 p5 H+ w编辑(回答评论):
" M' J* z8 K1 L7 Z5 x这是正确的。只要它是有效的语句,并且不会发生电源故障或查询可能失败的其他原因,它就可以完成。原子性本身仅保证陈述(一个或多个)是否正在执行。它保证完整性,并且数据没有损坏(因为写操作未完成或其他原因)。# `2 L0 w0 j; D/ B2 U5 w) \; ?
它不能保证您数据的正确性。 给出类似的查询,INSERT INTO foo SELECT MAX(id) 1 FROMbar;你必须设置正确的 隔离级别 确保您不会获得幻像读取或任何其他内容。 |
|
|
|
|
|