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

时间:2017-02-19 23:11:35

标签: mysql sql transactions locking innodb

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

实施例: Transaction1正在执行 "更新客户 SET City ='汉堡' WHERE CustomerID = 1;"

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

任何帮助将不胜感激。 谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

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

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

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

SELECTed之前的行COMMIT无法更改其他连接。

其他连接可以查看所涉及的行,但是他们可能会在 BEGIN开始之前看到值。阅读通常无所谓。通常重要的是BEGINCOMMIT之间的所有内容都是“一致的”,无论其他连接中发生了什么。

您的连接可能会延迟,等待其他连接放弃某些内容(例如SELECT...FOR UPDATE)。其他一些连接可能会延迟。或者可能存在“死锁” - 当InnoDB决定等待不起作用时。