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

时间:2013-07-08 11:19:46

标签: mysql innodb

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

我强烈建议你避免在没有where条款的情况下进行更新。它不在你的第二个(给每个人另一个点)查询。