mysql 第二类更新丢失_myslq的更新丢失实例

更新丢失,顾名思义,update执行后不生效,为啥不生效,因为update执行的效果丢了。什么情况下会发生更新丢失,在两个事务并发更新时,事务A的更新被事务B的更新覆盖,这叫第一类更新丢失;事务A执行更新,事务B执行更新后回滚,事务A的更新被事务B的回滚覆盖,这叫第二类更新丢失。

什么时候会发生更新丢失?没有启用事务隔离级别的时候,也就是不支持事务的存储引擎,如MyISam。但反过来,都没有事务了,我们怎么模拟两个并发的事务呢?除非用多线程跑。这里我们演示一下,在InnoDB启用最低级别的事务隔离级别——READ-UNCOMMITTED,会不会发生更新丢失:

1、先关闭事务自动提交,设置好事务隔离级别(参见mysql的事务隔离级别举例 ),给测试表新增一个字段:

mysql> alter tabletest_wlf-> add account int default '0';

Query OK,0 rows affected (0.11sec)

Records:0 Duplicates: 0 Warnings: 0mysql> desctest_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.00sec)

mysql> select * fromtest_wlf;+------+------+---------+

| id | name | account |

+------+------+---------+

| 1 | hi | 0 |

| 2 | lulu | 0 |

+------+------+---------+

2 rows in set (0.00 sec)

2、开启两个事务,分别提交update,一个+10,一个-5,按第一类更新丢失,-5会覆盖+10,最终结果是-5:

a7aca5584c13520d7a5c6b2c93b54b4f.png

3、再开启两个事务,分别提交update,一个+10块钱,一个-10块钱,减10块钱回滚,按第二类更新,-10会覆盖+10,最终应该是-5:

626fc476a567941672cf6444e66e66c5.png

我们看到,更新丢失确实没有发生。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值