接下来我们学习Mysql默认的事务隔离级别Repeatable Read,顾名思义,可重复读,也即在一个事务范围内相同的查询会返回相同的数据。

延续上面的栗子:

1. 小明很开心自己考了69分,于是他连接到数据库查询自己的成绩来炫耀给小伙伴,由于Repeatable Read是默认的事务隔离级别,因此这次他不需要进行修改:

xiaoming> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)xiaoming> begin;
Query OK, 0 rows affected (0.00 sec)xiaoming> select * from scores where name = 'xiaoming';
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | xiaoming |    69 |
+----+----------+-------+
1 row in set (0.00 sec)

2. 不幸的是,小明的班主任王老师复查试卷后,发现小明的成绩多加了10分,于是他连接到数据库来修改小明的成绩:

mr.wang> begin;
Query OK, 0 rows affected (0.00 sec)mr.wang> update scores set score = 59 where name = 'xiaoming';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mr.wang> commit;
Query OK, 0 rows affected (0.00 sec)

3. 接着小明觉得还不尽兴,于是又查一次,还是69分,可怜的是他不知道自己其实是不及格的:

xiaoming> select * from scores where name = 'xiaoming';
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | xiaoming |    69 |
+----+----------+-------+
1 row in set (0.00 sec)

可见Repeatable Read的确可以解决“不可重复读”的问题,小明在一次事务中2次查询的成绩都是一样的,即使2次查询中王老师修改了成绩。注意我们演示的场景中,王老师是针对一条已有的记录进行了Update, 如果王老师是新增即Insert小明的成绩,那么小明的2次查询的结果还是不一样的,如下所示:

1.首先小明第一次查询, 没有成绩

xiaoming> select * from scores where name = 'xiaoming';
Empty set (0.00 sec)

2. 然后王老师录入成绩

mr.wang> begin;
Query OK, 0 rows affected (0.00 sec)mr.wang> insert into scores(name,score) values ("xiaoming", 59);
Query OK, 1 row affected (0.00 sec)mr.wang> commit;
Query OK, 0 rows affected (0.00 sec)

3. 最后小明再次查询成绩,这次有了:

xiaoming> select * from scores where name = 'xiaoming';
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | xiaoming |    59 |
+----+----------+-------+
1 row in set (0.00 sec)

通过上述例子,我们可以看出Repeatable Read也是存在以下问题的:

a. 幻读,也即在一次事务范围内多次进行查询,如果其他并发事务中途插入了新的记录,那么之后的查询会读取到这些“幻影”行。

另外,我们也需要注意,不可重复读对应的是修改即Update,幻读对应的是插入即Insert。

6. 事务隔离级别之Repeatable Read相关推荐

  1. mysql repeatableread_关于 MySQL 的事务隔离级别(REPEATABLE READ)

    根据书上所说的,REPEATABLE READ 可以保证在一次事务中,相同查询得到结果是一致的,但是我做了一些测试,貌似跟书上结论不同. -- 创建测试表 create table test( id ...

  2. 五分钟搞清楚MySQL事务隔离级别

    好久没碰数据库了,只是想起自己当时在搞数据库的时候在事务隔离级别这块老是卡,似懂非懂的.现在想把这块整理出来,尽量用最简洁的语言描述出来,供新人参考. 首先创建一个表account.创建表的过程略过( ...

  3. mysql不支持python3吗_MySQL的4种事务隔离级别你还不清楚吗?

    前言 现在想把数据库这块整理出来,尽量用最简洁的语言描述出来,供新人参考. 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoD ...

  4. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  5. mysql四种输入_mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  6. sequelize怎么看插入的数据成功不成功_MySQL的4种事务隔离级别你还不清楚吗?

    前言 现在想把数据库这块整理出来,尽量用最简洁的语言描述出来,供新人参考. 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoD ...

  7. MySQL事务隔离级别解密

    READ UNCOMMITTED 未提交读  在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的.事务可以读取未提交的数据,这也被称作脏读.这个级别会导致很多问 ...

  8. 【MySQL】MySQL的四种事务隔离级别

    [MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事 ...

  9. mysql 事物隔离界别_MySQL锁与事务隔离级别

    ------------恢复内容开始------------ 一.概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.IO等)的 ...

最新文章

  1. 微生物组-扩增子16S分析第12期(报名直播课免费参加线下2021.7)
  2. 如何恢复电脑系统桌面
  3. Redis中缓存Lua 脚本
  4. html、css、js注释,js,html,css注释大集合
  5. 【Es】ElasticSearch 自定义分词器
  6. linux就该这么学第八课
  7. 技术博客2014年3月份头条记录
  8. 手机腾讯网mt2.0增量更新算法优化小记
  9. GB28181---XML解析
  10. MQTT-mosquitto学习笔记
  11. 【微信小程序】图片被压扁怎么办?在image中添加 mode=widthFix
  12. 网络信号浪涌防雷器的应用
  13. 功率放大器P1dB、P3dB和PSat指标释义
  14. 视觉镜头上的闪回画面
  15. 那些裸辞青年,现在过得还好吗?
  16. webstorm 打不开问题
  17. 如何在工作之余找精力做副项目?
  18. 购买阿里云服务器,先试试主机免费试用能抢到不...
  19. P1823 [COI2007] Patrik 音乐会的等待 单调栈
  20. sqlserver战德臣_数据库系统(上):模型与语言答案

热门文章

  1. STL用法(转自吉吉)
  2. H5页面全面屏设置底部安全距离
  3. 1-8Vmware中的文件共享
  4. 关于 appium 如何关闭 app (已解决)
  5. C语言电话号码查询系统[2023-01-16]
  6. python实现黑洞数字
  7. 详解GIoU、DIoU、CIoU Loss
  8. 基于Arduino的智能垃圾桶
  9. 惠普HP LaserJet 4200n 打印机驱动
  10. adb修改华为盒子的 value 和 name