zoukankan      html  css  js  c++  java
  • 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:

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

  • 相关阅读:
    小程序中的箭头函数
    总结:小程序常见问题(2)
    总结:小程序常见问题(1)
    实战:云开发-实现奶茶店小程序(二)
    实战:云开发-实现奶茶店小程序(一)
    实战:云开发-实现在线充值小程序
    ORACLE表名与列名小写转成大写
    MSSQL所有表名、列名转大写的SQL语句
    ORACLE 之 标识符无效 问题总结及解决方案
    SQL语句获取数据库中的表主键,自增列,所有列
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/14202806.html
Copyright © 2011-2022 走看看