gpt4 book ai didi

MySQL 可重复读取和丢失更新/幻读

转载 作者:可可西里 更新时间:2023-11-01 06:30:08 26 4
gpt4 key购买 nike

我在 MySQL Server 5.5 上试过这个:

1) 确保事务隔离级别是repeatable_read

2) 启动shell-1,在其中启动一个事务,然后通过select读取一个值

3) 启动 shell-2,在其中启动一个事务,然后通过 select 读取相同的值

4) 在 shell-1 中,将值更新为 value + 1 并提交

5) 在 shell-2 中,将值更新为 value + 1 并提交

该值丢失了一次更新,并且仅增加了 1。

现在,按照我的理解,RR使用了共享读锁和独占写锁,这意味着在上面的#4和#5中,事务应该发生死锁,但并没有发生。

所以要么我对 RR 的理解有误,要么 MySQL 以不同的方式实现 RR。那是什么?

编辑:通过类似的实验,还确认了 RR 事务 (t1) 没有看到由另一个 RR 事务 (t2) 插入到同一个表中的行,即使它在该表上进行了另一个选择,即使在 t2 已经提交并且在 t1 提交之前。 (这里是这个实验的链接:http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm)

这是否意味着 MySQL 的 RR 也处理幻读?

最佳答案

MySQL 确实不符合可重复读。您可以通过使用隔离级别可序列化或在您的选择之后放置 FOR UPDATE 来强制它执行(请看下面的示例)。然后将实现所需的行为。关于幻读,MySQL其实比必要的还要严格...

SELECT value FROM table WHERE id = 7 FOR UPDATE;

关于MySQL 可重复读取和丢失更新/幻读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10040785/

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