如何在 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
开始之前的值。阅读通常无关紧要。通常重要的是 BEGIN
和 COMMIT
之间的所有内容都是 "consistent",而不管其他连接中发生了什么。
您的连接可能会延迟,等待另一个连接释放某些东西(例如 SELECT...FOR UPDATE
)。其他一些连接可能会延迟。或者可能有一个 "deadlock" -- 当 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
开始之前的值。阅读通常无关紧要。通常重要的是 BEGIN
和 COMMIT
之间的所有内容都是 "consistent",而不管其他连接中发生了什么。
您的连接可能会延迟,等待另一个连接释放某些东西(例如 SELECT...FOR UPDATE
)。其他一些连接可能会延迟。或者可能有一个 "deadlock" -- 当 InnoDB 决定等待将不起作用时。