该实验基于 CentOS 7 + MySQL 5.7 进行

打开两个窗口连接到MySQL

第一个连接的事务我们命名为  T1

第二个连接的事务我们命名为 T2

T2 发生在 T1 的 O1 操作结束以后。

可以看到在 RR 隔离级别下,T1 的 O1 操作先进行查询 id=1 的用户信息,显示没有结果,按照正确的逻辑,此时我们是可以插入 id=1 的用户的;

然后我们在 T2 中执行了插入操作,插入了 id=1 的用户,并且提交成功;

然后我们在 T1 中也执行形同的插入操作,试图插入 id=1 的用户,此时报错,说违反了主键约束;

然后我们在 T1 中再次查询 id=1 的用户信息,发现仍然是没有结果。

这对于事务 T1 来说,是不是很过分?我先查询,你告诉我没有,我插入,你不让我插入,说主键冲突,我再查询,还是没有,你要怎样???

通过这个实验,可以清楚的看到,MySQL 的 RR 隔离级别通过 MVCC 确实保证了两次 select 结果的一致性,但此时 insert 带来的主键冲突问题并不能解决,我认为这应该称之为“半幻读”。

有人说通过 select ... for update 可以加锁避免幻读,是你没用而已。我认为 for update 手动加锁避免幻读并不是 RR 隔离级别本身带来的特性,并不能说 RR 隔离级别能够避免幻读。

最新文章

  1. 分布式服务注册和发现consul 简要介绍
  2. CSS中各种各样居中方法的总结
  3. Mac下遇到 'reading initial communication packet’ 问题
  4. 改变ubuntu终端显示语言(桌面系统是中文,终端提示是英文)
  5. Maven入门系列(二)--设置中央仓库的方法
  6. Flink DataSet API Programming Guide
  7. #linux包之psmisc之fuser命令
  8. socket传输过程
  9. maven安装配置(myeclipse)(一)
  10. android 自动化(1)
  11. undefined 和 null 的异同
  12. hdu 1205
  13. java转换字符串的编码(转)
  14. Codeforces Round #252 (Div. 2) B. Valera and Fruits(模拟)
  15. spring security 3.x 多页面登录配置入门教程
  16. Python VisibleDeprecationWarning: converting an array with ndim > 0 to an index will result in an error in the future
  17. IDEA新建项目时,没有Spring Initializr选项
  18. jenkins如何获取gitlab上的代码
  19. 初学JDBC的一些总结(一)
  20. http请求之get和post的区别

热门文章

  1. intellij idea 搜索
  2. PHP实现购物车的思路和源码分析
  3. 为 Ubuntu 18.04 添加开机自动加载 ntfs分区 功能
  4. 洛谷 1131 [ZJOI2007] 时态同步
  5. tp3.2.3 解决http://lx.com/后必须加index.php才能访问的问题,配置文件中忘了加index index.php index.html 等默认文件
  6. 防止SyntaxHighlighter.js的闪烁闪一下的方法
  7. ifram子页面与父页面的方法相互调用
  8. java NIO之HelloWorld
  9. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
  10. Yarn install 报错 Resolving packages... [2/4] Fetching packages... info There appears to be trouble with your network connection. Retrying