myslq的更新丢失实例
更新丢失,顾名思义,update执行后不生效,为啥不生效,因为update执行的效果丢了。什么情况下会发生更新丢失,在两个事务并发更新时,事务A的更新被事务B的更新覆盖,这叫第一类更新丢失;事务A执行更新,事务B执行更新后回滚,事务A的更新被事务B的回滚覆盖,这叫第二类更新丢失。
什么时候会发生更新丢失?没有启用事务隔离级别的时候,也就是不支持事务的存储引擎,如MyISam。但反过来,都没有事务了,我们怎么模拟两个并发的事务呢?除非用多线程跑。这里我们演示一下,在InnoDB启用最低级别的事务隔离级别——READ-UNCOMMITTED,会不会发生更新丢失:
1、先关闭事务自动提交,设置好事务隔离级别(参见mysql的事务隔离级别举例 ),给测试表新增一个字段:
mysql> alter table test_wlf -> add account int default '0'; Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test_wlf; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(25) | YES | | NULL | | | account | int(11) | YES | | 0 | | +---------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> select * from test_wlf; +------+------+---------+ | id | name | account | +------+------+---------+ | 1 | hi | 0 | | 2 | lulu | 0 | +------+------+---------+ 2 rows in set (0.00 sec)
2、开启两个事务,分别提交update,一个+10,一个-5,按第一类更新丢失,-5会覆盖+10,最终结果是-5:
3、再开启两个事务,分别提交update,一个+10块钱,一个-10块钱,减10块钱回滚,按第二类更新,-10会覆盖+10,最终应该是-5:
我们看到,更新丢失确实没有发生。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2018-12-28 Eclipse下无法解析注解:@Getter和@Setter