如何在 innodb 中实现隐式行级锁定?

how to implement implicit row level locking in innodb?

我正在使用 MySql(innodb 存储引擎)。我想在更新语句上实现行级隐式锁定。因此,没有其他事务可以同时读取或更新该行。

示例: 事务 1 正在执行 "更新客户 设置城市='Hamburg' WHERE CustomerID=1;"

然后,Transaction2 不应同时读取或更新同一行,但 Transaction2 应该能够访问其他行。

如有任何帮助,我们将不胜感激。 谢谢你的时间。

如果没有其他语句支持 UPDATE,它是原子的。

例如,如果您需要在决定更改之前查看该行,那么它会稍微复杂一些:

BEGIN;
SELECT ... FOR UPDATE;
decide what you need to do
UPDATE ...;
COMMIT;

COMMIT.

之前的行 SELECTed 不能更改其他连接

其他连接可以看到涉及的行,但他们可能看到 BEGIN 开始之前的值。阅读通常无关紧要。通常重要的是 BEGINCOMMIT 之间的所有内容都是 "consistent",而不管其他连接中发生了什么。

您的连接可能会延迟,等待另一个连接释放某些东西(例如 SELECT...FOR UPDATE)。其他一些连接可能会延迟。或者可能有一个 "deadlock" -- 当 InnoDB 决定等待将不起作用时。