A-A+

MySQL-可重复读

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

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

1. 可重复读。

首先,要了解的是,MySQL的事务默认隔离级别是:可重复读,即:在事务执行期间会锁定该事务以任何方式引用的所有行。

其它事务做更新时:

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

第一个事务,第一步查询

第二个事务,第三步查询

第一个事务,第四步查询

第一个事务,第六步查询

结论:其他事务做更新时,当前事务查询的结果:不变。

其它事务做插入时:

  1. #第一个事务
  2. START TRANSACTION;
  3. #第一步,第二个事务更新前查询
  4. SELECT * FROM test2;
  5. #第四步,第二个事务更新后查询
  6. SELECT * FROM test2;
  7. #第六步,第二个事务提交后查询
  8. SELECT * FROM test2;
  9. #第七步,提交事务
  10. 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. SELECT * FROM test2;
  9. #第七步,提交事务
  10. COMMIT;
  1. #第二个事务
  2. START TRANSACTION;
  3. #第二步,插入一条的数据
  4. DELETE FROM test2 WHERE id = '3333';
  5. #第三步,查询更新后的数据
  6. SELECT * FROM test2;
  7. #第五步,提交事务
  8. COMMIT;

第一个事务,第一步查询

第二个事务,第三步查询

第一个事务,第四步查询

第一个事务,第六步查询

结论:其他事务做删除时,当前事务查询的结果:不变。

以上是MySQL可重复读的测试示例及结论,下一次再说说MySQL幻读。

给我留言

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

用户登录

分享到: