gpt4 book ai didi

mysql - 这个更新丢失了吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:31:32 24 4
gpt4 key购买 nike

我只是想了解事务解决的“更新丢失”的含义。

请看下面两个事务,我用的是mysql 5.5.8和innodb存储引擎:

create table counter (what varchar(5), id integer, count integer, primary key (id));
insert into counter values ('total', 0, 0);

session 1 (T1) session 2(T2)
-------------------------------------------------------------------------
0 | begin;
-------------------------------------------------------------------------
1 begin; |
-------------------------------------------------------------------------
2 select count from counter |
where id = 0; |
-------------------------------------------------------------------------
3 | update counter set count = 50
| where id = 0;
-------------------------------------------------------------------------
4 | commit;
------------------------------------------------------------------------
5 update counter set count |
= 1000 where id = 0; |
-------------------------------------------------------------------------
6 commit; |
-------------------------------------------------------------------------

您可以将值 1000 和 50 视为:

  1. 更新值1000取决于count的读取,即select。
  2. 更新值 50 取决于另一次读取(与 session1 不冲突)。

所以,这是典型的读写依赖关系。

session1 (T1) commit 并再次执行 'select count from counter where id=0' 后,计数将为 1000。我想知道是否是update lost 还是不是?如果不是为什么?如果我没记错的话,在任何隔离级别中都将避免最后进行任何类型的更新。

可能的修复方法之一是使用“从 id = 0 的计数器中选择计数进行更新;”在第 2 步,这相当于在记录上添加 xlock,因此 T2 将被阻止。所以这是作为 [T1,T2] 串行执行的。

这是 Innodb 的(已知)错误吗?注意,这不等同于执行[T2,T1],因为,T1会用这个序列读取另外50个0,最终结果会有所不同。

谢谢

最佳答案

是的,更新当然丢失了。对于外界,您的事务只有在提交时才真正“执行”。对于第三方,您的架构对应于:

  1. session 2 将 ID 0 的计数器更新为 50
  2. session 1 将 ID 0 的计数器更新为 1000

您实际上什至不需要为此进行交易:交易没有任何区别。如果您的 session 1 在 session 2 进行更新后进行了选择,它们将很重要。在这种情况下,对于事务, session 1 将读取值 0,但如果没有事务,它将读取值 50。

关于mysql - 这个更新丢失了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164277/

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