SELECT的目的是什么...... * FOR FORDDATE *?

时间:2011-03-23 20:39:18

标签: mysql

我很困惑你为什么要指定FOR UPDATE - 为什么数据库会关心你要对SELECT的数据做些什么?

编辑:对不起,我问的不好。我知道文档说它将事物变成了“锁定读取” - 我想知道的是“在指定FOR UPDATE而不指定它之间可观察行为会有什么不同的情况 - 这是具体是什么锁定需要什么?

5 个答案:

答案 0 :(得分:11)

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

它与在事务中锁定表有关。假设您有以下内容:

START TRANSACTION;
SELECT .. FOR UPDATE;
UPDATE .... ;
COMMIT;

在SELECT语句运行之后,如果您有另一个来自不同用户的SELECT,则在第一个事务到达COMMIT行之前它将不会运行。

另请注意,交易之外的FOR UPDATE毫无意义。

答案 1 :(得分:2)

此设计用于修复的特定情况是您需要读取和更新列中的值。有时您可以先更新列(锁定它),然后再读取它,例如:

UPDATE child_codes SET counter_field = counter_field + 1;
SELECT counter_field FROM child_codes;

这将返回counter_field的新值,但在您的应用程序中可以接受。如果您尝试重置字段(并且因此需要原始值)或者如果您有一个无法在更新语句中表达的复杂计算,那将是不可接受的。在这种情况下,为避免两个连接竞争同时更新同一列,您需要锁定该行。

如果您的RDBMS不支持FOR UPDATE,那么您可以通过执行无用的更新来模拟它,例如。

UPDATE child_codes SET counter_field = counter_field;
SELECT counter_field FROM child_codes;
UPDATE child_codes SET counter_field = 0;

答案 2 :(得分:1)

SELECT FOR UPDATE告诉RDBMS您要锁定这些行,这样在您更新并提交或回滚它们并解锁它们之前,没有其他人可以访问它们:

http://www.techonthenet.com/oracle/cursors/for_update.php

答案 3 :(得分:0)

它会创建一个锁定读取,以便在完成之前没有人可以更新它,例如

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

请参阅此处http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

答案 4 :(得分:0)

它将锁定行(或整个表),以便不能在另一个会话中同时更新行。锁定一直持续到提交或回滚事务。