我很困惑你为什么要指定FOR UPDATE
- 为什么数据库会关心你要对SELECT
的数据做些什么?
FOR UPDATE
而不指定它之间可观察行为会有什么不同的情况 - 这是具体是什么锁定需要什么?
答案 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您要锁定这些行,这样在您更新并提交或回滚它们并解锁它们之前,没有其他人可以访问它们:
答案 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)
它将锁定行(或整个表),以便不能在另一个会话中同时更新行。锁定一直持续到提交或回滚事务。