事情是关于一个非常简单的更新语句:
UPDATE `user` SET fans = fans +1 where id = 8;
(因为仅在单个[自动提交]使用它时不会引起任何并发问题,所以我想弄清楚它在手动交易中的行为。 llet假设粉丝= 0。
是:the begin交易A,并保持。
the begin交易b,更新
user
user
中选择 * whene id = 8;”在Tran A中,粉丝的结果为0,它符合期望。 (因为我们在RR中,交易开始后不应该看到任何更新。)user
我的mysql版本是'8.0.41-0ubuntu0.22.04.1',隔离为“可重复阅读”,引擎是Innodb.
步骤1:开始交易[无锁RN]
交易a执行的声明A开始时不应返回快照的结果。
谨慎,步骤3应该是:
user
中选择 * whene id = 8;”在Tran A中,粉丝的结果为
1,它与可重复的阅读无关,因为可重复的读取隔离仅在您读取一行后才开始。
为什么?
coz可重复的读取并不意味着,交易开始时应保留整个桌子的快照,但是如果您已经阅读了某些数据,则该快照将在交易中保持不变。 其他单词,在交易中读取特定行,交易无法在同一行上执行更新或删除操作。但是,当前交易[即交易a]可以更改行,这些更新只能在关注的交易中可见[即交易a] 之后,
这些步骤的架子与期望一致。 thanks.