A-A+

MySQL-幻读

2018年11月25日 技术, 默认 暂无评论 阅读 2,534 次

本文基于MySQL的数据库引擎InnoDB,通过本文了解:

1. 幻读:在一个事务的两次查询中数据不一致。

上一篇了解了MySQL的不可重复读,但是有时候同一个事务中,前后两次查询显示数据有可能是不一致的,以下就为示例:

更新了其它事务中新增数据:

  1. #第一个事务
  2. START TRANSACTION;
  3. #第一步,第二个事务插入前查询
  4. SELECT * FROM test2;
  5. #第五步,第二个事务插入后查询
  6. SELECT * FROM test2;
  7. #第六步,更新第二个事务插入的数据
  8. UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
  9. #第七步,第二个事务提交后查询
  10. SELECT * FROM test2;
  11. #第八步,提交事务
  12. COMMIT;
  1. #第二个事务
  2. START TRANSACTION;
  3. #第二步,插入一条的数据
  4. INSERT INTO `test2` (`id`, `name`, `sum_count`) VALUES ('3333', '3333', '1');
  5. #第三步,查询插入后的数据
  6. SELECT * FROM test2;
  7. #第四步,提交事务
  8. COMMIT;

第一步,第一个事务查询

第三步,第二个事务查询

第五步,第一个事务查询

第七步,第一个事务查询

结论:其它事务做插入,当前事务更新了插入的数据,当前事务查询的结果:被更新列为最新值。

更新了其它事务中删除数据:

  1. #第一个事务
  2. START TRANSACTION;
  3. #第一步,第二个事务删除前查询
  4. SELECT * FROM test2;
  5. #第五步,第二个事务删除后查询
  6. SELECT * FROM test2;
  7. #第六步,更新第二个事务删除的数据
  8. UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
  9. #第七步,第二个事务提交后查询
  10. SELECT * FROM test2;
  11. #第八步,提交事务
  12. COMMIT;
  1. #第二个事务
  2. START TRANSACTION;
  3. #第二步,删除一条的数据
  4. DELETE FROM `test2` WHERE id = '3333';
  5. #第三步,查询删除后的数据
  6. SELECT * FROM test2;
  7. #第四步,提交事务
  8. COMMIT;

第一步,第一个事务查询

第三步,第二个事务查询

第五步,第一个事务查询

第七步,第一个事务查询

结论:其它事务做删除,当前事务更新了删除的数据,当前事务查询的结果:该删除的数据仍然存在,被更新列的值不变。

更新了其它事务中修改数据:

  1. #第一个事务
  2. START TRANSACTION;
  3. #第一步,第二个事务更新前查询
  4. SELECT * FROM test2;
  5. #第五步,第二个事务更新后查询
  6. SELECT * FROM test2;
  7. #第六步,更新第二个事务更新的数据
  8. UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
  9. #第七步,第二个事务提交后查询
  10. SELECT * FROM test2;
  11. #第八步,提交事务
  12. COMMIT;
  1. #第二个事务
  2. START TRANSACTION;
  3. #第二步,更新一条的数据
  4. UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
  5. #第三步,查询更新后的数据
  6. SELECT * FROM test2;
  7. #第四步,提交事务
  8. COMMIT;

第一步,第一个事务查询

第三步,第二个事务查询

第五步,第一个事务查询

第七步,第一个事务查询

结论:其它事务做更新,当前事务更新了该条数据,当前事务查询的结果:被更新列为最新值。

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: