【问题标题】:How to lock rows in an InnoDB table?如何锁定 InnoDB 表中的行?
【发布时间】:2011-11-10 09:11:18
【问题描述】:

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

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

我使用php连接mySQL数据库。

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

【问题讨论】:

  • 为什么需要锁定表中的行?你确定你没有落入The XY Problem

标签: php mysql innodb


【解决方案1】:

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;

【讨论】:

  • 这部分对我来说没问题。但是如果想要更新的用户与用户锁定行相同,mySQL 如何知道更新。谢谢
  • @Flex60460,MySQL 会跟踪连接。你不必担心这个。
  • @Flex60460 你真的想锁定跨越多个 HTTP 请求的行吗?
  • 但这需要在我认为没有效果的交易之间?强制锁定的主要目标是避免一些竞争条件,例如,当 2 个独立的连接读取一个值并对该值采取行动时,他们才将该值更改为其他值,这不会触发相同的结果。因此,连接 2 应该等待任何可能首先修改该行列值的连接,然后才读取它。基本上,如果另一个连接当前正在该行上工作,它应该等待。
【解决方案2】:
select col1, col2 from table1 where col3='test' for update

【讨论】:

  • 谢谢你保存了我的项目,但请尝试从我身边为其他人 +1 详细说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多