A-A+
MySQL-幻读
本文基于MySQL的数据库引擎InnoDB,通过本文了解:
1. 幻读:在一个事务的两次查询中数据不一致。
上一篇了解了MySQL的不可重复读,但是有时候同一个事务中,前后两次查询显示数据有可能是不一致的,以下就为示例:
更新了其它事务中新增数据:
- #第一个事务
- START TRANSACTION;
- #第一步,第二个事务插入前查询
- SELECT * FROM test2;
- #第五步,第二个事务插入后查询
- SELECT * FROM test2;
- #第六步,更新第二个事务插入的数据
- UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
- #第七步,第二个事务提交后查询
- SELECT * FROM test2;
- #第八步,提交事务
- COMMIT;
- #第二个事务
- START TRANSACTION;
- #第二步,插入一条的数据
- INSERT INTO `test2` (`id`, `name`, `sum_count`) VALUES ('3333', '3333', '1');
- #第三步,查询插入后的数据
- SELECT * FROM test2;
- #第四步,提交事务
- COMMIT;
第一步,第一个事务查询
第三步,第二个事务查询
第五步,第一个事务查询
第七步,第一个事务查询
结论:其它事务做插入,当前事务更新了插入的数据,当前事务查询的结果:被更新列为最新值。
更新了其它事务中删除数据:
- #第一个事务
- START TRANSACTION;
- #第一步,第二个事务删除前查询
- SELECT * FROM test2;
- #第五步,第二个事务删除后查询
- SELECT * FROM test2;
- #第六步,更新第二个事务删除的数据
- UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
- #第七步,第二个事务提交后查询
- SELECT * FROM test2;
- #第八步,提交事务
- COMMIT;
- #第二个事务
- START TRANSACTION;
- #第二步,删除一条的数据
- DELETE FROM `test2` WHERE id = '3333';
- #第三步,查询删除后的数据
- SELECT * FROM test2;
- #第四步,提交事务
- COMMIT;
第一步,第一个事务查询
第三步,第二个事务查询
第五步,第一个事务查询
第七步,第一个事务查询
结论:其它事务做删除,当前事务更新了删除的数据,当前事务查询的结果:该删除的数据仍然存在,被更新列的值不变。
更新了其它事务中修改数据:
- #第一个事务
- START TRANSACTION;
- #第一步,第二个事务更新前查询
- SELECT * FROM test2;
- #第五步,第二个事务更新后查询
- SELECT * FROM test2;
- #第六步,更新第二个事务更新的数据
- UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
- #第七步,第二个事务提交后查询
- SELECT * FROM test2;
- #第八步,提交事务
- COMMIT;
- #第二个事务
- START TRANSACTION;
- #第二步,更新一条的数据
- UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '3333';
- #第三步,查询更新后的数据
- SELECT * FROM test2;
- #第四步,提交事务
- COMMIT;
第一步,第一个事务查询
第三步,第二个事务查询
第五步,第一个事务查询
第七步,第一个事务查询
结论:其它事务做更新,当前事务更新了该条数据,当前事务查询的结果:被更新列为最新值。