0

说,我们有一个名为 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;

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

4

1 回答 1

1

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

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

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

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

我强烈建议您避免在没有 where 子句的情况下进行更新,因为这样做是有意义的。它不在您的第二次(给每个人另一点)查询中。

于 2013-07-08T12:39:42.560 回答