A-A+
MySQL-可重复读
本文基于MySQL的数据库引擎InnoDB,通过本文了解:
1. 可重复读。
首先,要了解的是,MySQL的事务默认隔离级别是:可重复读,即:在事务执行期间会锁定该事务以任何方式引用的所有行。
其它事务做更新时:
- #第一个事务
- START TRANSACTION;
- #第一步,第二个事务更新前查询
- SELECT * FROM test2;
- #第四步,第二个事务更新后查询
- SELECT * FROM test2;
- #第六步,第二个事务提交后查询
- SELECT * FROM test2;
- #第七步,提交事务
- COMMIT;
- #第二个事务
- START TRANSACTION;
- #第二步,更新一条已存在的数据
- UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '1111';
- #第三步,查询更新后的数据
- SELECT * FROM test2;
- #第五步,提交事务
- COMMIT;
第一个事务,第一步查询
第二个事务,第三步查询
第一个事务,第四步查询
第一个事务,第六步查询
结论:其他事务做更新时,当前事务查询的结果:不变。
其它事务做插入时:
- #第一个事务
- START TRANSACTION;
- #第一步,第二个事务更新前查询
- SELECT * FROM test2;
- #第四步,第二个事务更新后查询
- SELECT * FROM test2;
- #第六步,第二个事务提交后查询
- 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;
- #第六步,第二个事务提交后查询
- SELECT * FROM test2;
- #第七步,提交事务
- COMMIT;
- #第二个事务
- START TRANSACTION;
- #第二步,插入一条的数据
- DELETE FROM test2 WHERE id = '3333';
- #第三步,查询更新后的数据
- SELECT * FROM test2;
- #第五步,提交事务
- COMMIT;
第一个事务,第一步查询
第二个事务,第三步查询
第一个事务,第四步查询
第一个事务,第六步查询
结论:其他事务做删除时,当前事务查询的结果:不变。
以上是MySQL可重复读的测试示例及结论,下一次再说说MySQL幻读。