问题一:

当事务隔离级别设置为可重复读的时候,将所有select过的行都加了读锁,并且记录了版本号,当update 的时候们如果发现版本号变了,则事务失败回滚。不知道我这样理解是否正确?

问题二:

如果上面的理解正确,那是否innodb的可重复读这个隔离级别已经帮我们实现了乐观锁,所以并不需要手动通过版本或者时间戳来实现乐观锁,或者使用 悲观锁了?

问题三:

悲观锁 select … for update 是增加了一个写锁? 所以所有的读写都会被block住?

问题四:

假设有事务A,先select 然后 update,事务B同样也是先select 然后再update

如果事务隔离级别为可重复读,事务A,B先后select加上了读锁,那么会不会因此而后面的update操作会互相block住,导致死锁?

问题一和问题四好像是矛盾的,因为如果问题四成立,事务会block住,也不会修改成功导致版本号不一致导致 回滚了。

问题一:

可重复读(REPEATABLE READ)时,普通的 SELECT 并没有加读锁(话说 innodb 有读锁这种概念么?),而是由 mysql 缓存了 SELECT 的结果集,保证在这个事务里同样的 SELECT 语句得到的结果始终一致。所以也不存在 UPDATE 的时候版本号错误的问题,也不会因此回滚。

可以参考:http://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html

问题二:

对于可重复读级别的事务,因为你在事务中,只要不 COMMIT 任何修改都不会发生,也读不到别人更新的数据,所以你既无法加乐观锁,也无法在 COMMIT 前判断别人是否已经更新了数据,这使得你无论如何都实现不了乐观锁。

只有用 READ COMMITTED 才能实现你希望的乐观锁。

问题三:

FOR UPDATE 就是锁住所有选出来的记录,是一个写锁,所有的写都会被 block,普通的 SELECT 不会被 block。

问题四:

因为没有所谓的读锁存在,所以没有你想的这个问题存在。

这个问题有些复杂,根据事务隔离的定义,可重复读是需要上读锁的:

wiki中文说明

wiki英文说明

也就是保证读取的内容不会发生改变。

但根据mysql的文档,innodb的实现机制是在读的时候,建立快照,以保证在单个事务内,读取的内容不会发生变化:mysql文档

那么就是产生了一些微妙的区别。。。虽然对结果来说没区别=。=

问题一二如同@Huan Du所说,没读锁所以不会失败,需要自己实现锁

问题四,不会有死锁

Mysql 乐观锁 事务,Mysql事务隔离级别与乐观锁的问题相关推荐

  1. MySql事务4种隔离级别以及悲观锁和乐观锁

    前言:在那鬼公司呆着发现自己居然把事务给搞明白了. 缘由:公司做的一个项目在进行首页内容显示的时候发现查询结果特别慢,有时候需要一到五分钟才能显示出结果.于是乎,我就顺着SQL语句查询慢的原因找了下去 ...

  2. 锁和并发性----隔离级别

    隔离级别决定事务间的可见程度,理解隔离级别是做什么的,你就能明白它们是如何阻止并发性副作用的.下面介绍各种事务隔离级别. Serializable Serializable隔离级别在SQL Serve ...

  3. mysql隔离级别与悲观锁、乐观锁

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是悲观锁,乐观锁 悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.但随之而来的就是数据库性能的大 ...

  4. 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别

    MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...

  5. 一文彻底读懂MySQL事务的四大隔离级别

    前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...

  6. MySQL事务原理之事务概述和隔离级别

    MySQL事务概述和隔离级别 事务 事务的特征 事务的控制语句 事务的生命周期 事务执行过程 ACID特性 原子性(A) 一致性(C) 隔离性(I) 持久性(D) 隔离级别 命令 不同隔离级别并发异常 ...

  7. MySQL 之事务 及 其隔离级别

    MySQL 之事务 及 其隔离级别 /* 事务:表示一组操作(sql),要么同时成功,要么同时失败,那么这种操作就构成了一个事务. 例如: 张三 给 李四 转账 500元 (1)把张三的余额减少500 ...

  8. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别

    http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 一.脏读.不可重复读.幻读 1.脏读:脏读就是指当一个事务正在访问数据,并 ...

  9. 事务的四大隔离级别中的幻读问题

    1. 什么是幻读? 大部分学习过数据库的人应该都了解幻读这个概念,我在这里帮大家复习下.以下都是以InnoDB存储引擎为例进行说明.数据库并发访问中,针对delete和insert操作可能出现幻读这种 ...

  10. 数据库 之 事务控制和隔离级别

    1  概述 事务是指一组原子性的SQL查询.或者是一个或多个SQL语句组成的独立工作单元:MyISAM不流行的原因很大是因为其不支持事务的处理功能. 2  事务日志 事务日志定义属性,有些参数可以运行 ...

最新文章

  1. visual basic从入门到精通第三版cd_C++从零到精通,这才是你需要的书单!
  2. RandomForestClassifier参数min_samples_leaf和min_samples_split理解
  3. mysql安装到最后报错_mysql 安装到最后一步时,start service 为失败状态
  4. rxjs里scan operators的用法
  5. init/inittab
  6. Abbreviated biography of Jon Claerbout
  7. c语言学习-自定义并调用函数求三个数的最小公倍数
  8. vue 表单 input radio
  9. 第六章 应用层[练习题+课后习题]
  10. spark 算子使用类变量_Scala与Spark是天生的一对?
  11. rmd中无法打开链结r_小编详解 win7系统无法访问网络打印机的修复教程 -win7系统使用教程...
  12. 【华为浏览器如何安装扩展程序】
  13. 老友记台词学习笔记 SE01EP03(三)
  14. Qlikview---数据类型
  15. 基于遗传算法的卷积神经网络架构搜索
  16. 通过内存模拟硬盘实现一个简单的块设备驱动
  17. 实现购物车功能php,php 购物车功能实现代码(入门例子)
  18. c语言求玫瑰花数带注释,新人 用C语言画一朵玫瑰
  19. 【SVM分类】基于matlab哈里斯鹰算法优化支持向量机SVM分类【含Matlab源码 2243期】
  20. scrapy--(failed 3 times): [<twisted.python.failure.Failure twisted.web._newclient.ParseError

热门文章

  1. android 8三星note8,【三星GALAXYNote8评测】一出场就赢了 三星Note 8双摄深度解析_三星 GALAXY Note 8_手机评测-中关村在线...
  2. 在linux中查找重复的文件夹,如何查找(和删除)重复文件
  3. 烘焙管理者须警惕的九大错误
  4. Python打招呼函数
  5. xp系统宽带连接断开怎么连接服务器,winxp的怎样断开和启用连接_winxp系统如何随意断开和启用连接网络图文教程...
  6. 你了解EDIUS非线性编辑软件吗?
  7. 问题事件名称: CLR20r3 解决方法
  8. 微信小程序开发学习--7.27日
  9. c语言课程设计情侣,C/C++编程笔记:C语言制作情侣必备《爱情电子相册》,源码解析!...
  10. 这几个相见恨晚的PDF转换成Word技巧,请收好