gpt4 book ai didi

mysql - FOR UPDATE 似乎没有锁定 MySql InnoDB 中的行

转载 作者:行者123 更新时间:2023-11-28 23:25:13 25 4
gpt4 key购买 nike

MySql = v5.6

表引擎 = InnoDB

我打开了一个 mysql cli。我跑:

开始交易;

SELECT id FROM my_table WHERE id=1 FOR UPDATE;

然后我打开并运行第二个 cli:

SELECT id FROM my_table WHERE id=1;

我希望它等到我提交或回滚第一个事务,但它没有,它只是立即带回行,就好像没有发生行锁定一样。

我做了另一个测试,我在第一个 cli 中更新了一个 status 字段,在提交事务之前我无法在第二个 cli 中看到该更改,证明事务确实有效。

我是误解了 FOR UPDATE 还是做错了什么?

更新:

在第二次 SELECT 查询时需要 FOR UPDATE

最佳答案

您看到的那个 Action 是有效的。使用“MVCC”,不同的连接可以在行上看到不同的版本。

第一个连接获取了一种阻止写入但不是读取的锁。如果第二个连接完成了 FOR UPDATEINSERT 或其他“写入”类型的操作,则它要么延迟等待锁被释放,要么死锁。 (死锁也需要其他锁。)

通用模式

BEGIN;
SELECT ... FOR UPDATE; -- the row(s) you will update in this transaction
miscellany work
UPDATE...; -- those row(s).
COMMIT;

如果两个线程在“同一”时间在同一行上运行该代码,则第二个线程将在 SELECT..FOR UPDATE 处停止。第一个线程完成后,SELECT 将运行,获取新值。一切顺利。

与此同时,其他线程可以SELECT(无需更新)并获取一些值。将这些线程视为在事务之前或之后获取值,具体取决于所有线程的确切时间。重要的是这些“其他”线程将看到数据的一致 View ——没有该事务中的更新已被应用,或者所有都已应用。这就是“原子”的意思。

关于mysql - FOR UPDATE 似乎没有锁定 MySql InnoDB 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com