gpt4 book ai didi

mysql - 竞争条件下的 INSERT-SELECT 和 UPDATE

转载 作者:行者123 更新时间:2023-11-29 10:00:01 24 4
gpt4 key购买 nike

#1:如果我运行

INSERT INTO foo SELECT MAX(X) FROM bar;

我能否确定我刚刚插入了 bar 表中 X 列的最大值?在 SELECT 部分完成之后、INSERT 完成之前,没有其他 session 设法操作 bar 表?

#2:如果我运行

UPDATE foo SET x = 0 WHERE y = 100;

当时钟到达 00:00 并且查询需要 2 分钟时,我能否确定在 00:00 具有 y = 100 的所有行都已更新?在我的查询完成之前,没有其他 session 设法将 y = 100 更改为 y = 80

#3:这与#2 相关。如果在 00:01 另一个 session 通过将 y = 99 更改为 y = 100 对一行进行 UPDATE,我之前的查询是否会尝试来更新这一行?

最佳答案

如果不使用显式事务,则每个查询本身都会被视为一个事务。因此,像 #1 一样结合 INSERTSELECT 的查询可以依赖于一致性。它大致相当于:

START TRANSACTION;
SET @max = (SELECT MAX(x) FROM bar);
INSERT INTO foo VALUES (@max);
COMMIT;

但是,事务不会在事务启动时创建整个数据库的快照。 InnoDB 使用每记录锁定。因此,在 #2 和 #3 中,如果 session A 更新 y,而 session B 执行您显示的查询,则 B 更新的记录可能包含也可能不包含 A 修改的记录,具体取决于这些特定变化的相对顺序。另一方面,MyISAM 使用表级锁,因此这应该是不可能的;无论哪个查询先启动,都会锁定 foo 表,另一个查询将等待它完成,然后再开始扫描表。

关于mysql - 竞争条件下的 INSERT-SELECT 和 UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com