更新语句的曲折行为

问题描述 投票:0回答:1

事情是关于一个非常简单的更新语句:

UPDATE `user` SET fans = fans +1 where id = 8;

(因为仅在单个[自动提交]使用它时不会引起任何并发问题,所以我想弄清楚它在手动交易中的行为。 llet假设粉丝= 0。

是:

the begin交易A,并保持。

the begin交易b,更新

user
    设置pan = fans +1 where id = 8,并提交。
  1. 现在,在当前表中,ID = 8集的粉丝到1.
  2. Exec“从
    user
    中选择 * whene id = 8;”在Tran A中,粉丝的结果为0,它符合期望。 (因为我们在RR中,交易开始后不应该看到任何更新。)
  3. 但是,当exec“ expect” exec“ seet set pan = fans +1 where id = 8;”在tran a中,然后使用“从
  4. user
  5. 中选择 * ind = 8;”;同样,我们可以看到“粉丝”字段已更新为2。 看来这是RC的行为,而不是RR Hehavior。 (但是'select @@ transaction_isolation;'说它在'可重复阅读'中)。 tran a,“粉丝”的价值为2。
    我的mysql版本是'8.0.41-0ubuntu0.22.04.1',隔离为“可重复阅读”,引擎是Innodb.
  6. 我认为,这是“自我提示”的特殊设计功能,还是出了问题?我不是专家,所以我很困惑,期待对此的任何见解。
  7. 观察有一个错误。
    
    步骤1:开始交易[无锁RN]
  8. 步长2:通过事务B进行更新语句[步骤3是同一步骤的一部分]
步4:

交易a执行的声明A开始时不应返回快照的结果。

谨慎,步骤3应该是:

mysql transactions sql-update innodb isolation-level
1个回答
0
投票
user

中选择 * whene id = 8;”在Tran A中,粉丝的结果为

1

,它与可重复的阅读无关,因为可重复的读取隔离仅在您读取一行后才开始。

为什么?

coz可重复的读取并不意味着,交易开始时应保留整个桌子的快照,但是如果您已经阅读了某些数据,则该快照将在交易中保持不变。 其他单词,在交易中读取特定行,交易无法在同一行上执行更新或删除操作。但是,当前交易[即交易a]可以更改行,这些更新只能在关注的交易中可见[即交易a] 之后,

这些步骤的架子与期望一致。 thanks.

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.