我正在使用MySql(innodb存储引擎)。我想在update语句上实现行级隐式锁定。所以,没有其他事务可以同时读取或更新该行。
实施例: Transaction1正在执行 "更新客户 SET City ='汉堡' WHERE CustomerID = 1;"
然后,同时Transaction2不能读取或更新同一行,但Transaction2应该能够访问其他行。
任何帮助将不胜感激。 谢谢你的时间。
答案 0 :(得分:1)
如果没有其他语句支持UPDATE
,则它是原子的。
例如,如果您在决定更改行之前需要查看该行,那么它会更复杂一些:
BEGIN;
SELECT ... FOR UPDATE;
decide what you need to do
UPDATE ...;
COMMIT;
SELECTed
之前的行COMMIT
无法更改其他连接。
其他连接可以查看所涉及的行,但是他们可能会在 BEGIN
开始之前看到值。阅读通常无所谓。通常重要的是BEGIN
和COMMIT
之间的所有内容都是“一致的”,无论其他连接中发生了什么。
您的连接可能会延迟,等待其他连接放弃某些内容(例如SELECT...FOR UPDATE
)。其他一些连接可能会延迟。或者可能存在“死锁” - 当InnoDB决定等待不起作用时。