gpt4 book ai didi

mysql - 使用 InnoDb 时 UPDATE 语句是单独锁定表中的行还是完全锁定表中的行

转载 作者:行者123 更新时间:2023-11-29 13:45:09 24 4
gpt4 key购买 nike

假设我们有一个名为 person 的表,如下所示

CREATE TABLE person (
id INT,
name VARCHAR(30),
point INT
);

我想更新整个表格,根据其他人的喜好改变一个人的观点

UPDATE person SET point=(
SELECT point FROM person WHERE some-condition
);

或者,只是加一,例如

UPDATE person SET point=point+1;

执行上述脚本时,哪些行将被锁定以及其他语句是否会等待更新语句完成或可以在两个更新操作之间执行

最佳答案

两个更新语句都没有 where 子句。 (您的第一个有一个带有 where 子句的选择;您可能希望该 where 子句成为更新的一部分,但我对此不确定。)

这意味着他们将更新您的 person 表中的所有行。 InnoDB 提供的事务语义表示每一行都将被锁定,直到整个更新完成。也就是说,其他更新将被阻止。如果您尝试按照与此查询中的顺序不同的顺序进行其他更新,则会面临死锁的风险。

其他客户端连接选择查询将看到表的先前状态...更新语句开始之前的状态...直到更新语句完成。在许多情况下,InnoDB 可以做到这一点,而不会延迟对其他连接查询的响应。但有时它必须延迟响应。最大的延迟可能出现在更新查询结束时,而 InnoDB 正在提交其结果。

请记住这一点:为了实现事务语义,InnoDB 牺牲了查询性能的可预测性。

我强烈建议您避免在没有 where 子句的情况下进行更新(如果这样做有意义的话)。它不会出现在你的第二个(给每个人另一分)查询中。

关于mysql - 使用 InnoDb 时 UPDATE 语句是单独锁定表中的行还是完全锁定表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525335/

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