如何在InnoDB表中锁定行?

4

我是一个新的MySQL用户。我创建了一个InnoDB数据库系统。

在我的情况下,如果使用select for update,我需要锁定行。但即使我做了很多搜索,我也不明白如何在一个用户加载这一行时为所有用户锁定行。

我使用php连接到mysql数据库。

您能帮我解决这个问题吗?


为什么需要锁定表中的行?你确定自己没有陷入“XY问题”中吗? - user212218
2个回答

8
MySQL会自动为您进行行锁定。
因此,没有必要自己进行行锁定。
但是,如果您坚持这样做,可以使用select ... for update
请参见:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

1
这部分对我来说没问题,但是mySQL怎么知道更新操作的用户是否与锁定行的用户相同呢?谢谢。 - Flex60460
2
@Flex60460,MySQL会跟踪连接情况,您不需要担心这个。 - Johan
@Flex60460 你是否真的想要锁定跨多个HTTP请求的行? - nos
但我认为这需要在事务之间进行,否则没有效果?强制锁定的主要目的是避免一些竞争条件,例如当两个独立的连接读取一个值并根据该值执行操作,然后才将该值更改为其他值时,这不会触发相同的结果。因此,连接2应该等待任何可能修改该行列值的连接,然后再读取它。基本上,如果另一个连接正在处理该行,则它应该等待。 - Miguel

2
select col1, col2 from table1 where col3='test' for update

3
谢谢你拯救了我的项目,但请尝试为其他人详细解释一下。我给你点赞。 - Ravinder Payal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接