Mysql 乐观锁 事务,Mysql事务隔离级别与乐观锁的问题
问题一:
当事务隔离级别设置为可重复读的时候,将所有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事务隔离级别与乐观锁的问题相关推荐
- MySql事务4种隔离级别以及悲观锁和乐观锁
前言:在那鬼公司呆着发现自己居然把事务给搞明白了. 缘由:公司做的一个项目在进行首页内容显示的时候发现查询结果特别慢,有时候需要一到五分钟才能显示出结果.于是乎,我就顺着SQL语句查询慢的原因找了下去 ...
- 锁和并发性----隔离级别
隔离级别决定事务间的可见程度,理解隔离级别是做什么的,你就能明白它们是如何阻止并发性副作用的.下面介绍各种事务隔离级别. Serializable Serializable隔离级别在SQL Serve ...
- mysql隔离级别与悲观锁、乐观锁
2019独角兽企业重金招聘Python工程师标准>>> 1.什么是悲观锁,乐观锁 悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.但随之而来的就是数据库性能的大 ...
- 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别
MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...
- 一文彻底读懂MySQL事务的四大隔离级别
前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...
- MySQL事务原理之事务概述和隔离级别
MySQL事务概述和隔离级别 事务 事务的特征 事务的控制语句 事务的生命周期 事务执行过程 ACID特性 原子性(A) 一致性(C) 隔离性(I) 持久性(D) 隔离级别 命令 不同隔离级别并发异常 ...
- MySQL 之事务 及 其隔离级别
MySQL 之事务 及 其隔离级别 /* 事务:表示一组操作(sql),要么同时成功,要么同时失败,那么这种操作就构成了一个事务. 例如: 张三 给 李四 转账 500元 (1)把张三的余额减少500 ...
- 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别
http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 一.脏读.不可重复读.幻读 1.脏读:脏读就是指当一个事务正在访问数据,并 ...
- 事务的四大隔离级别中的幻读问题
1. 什么是幻读? 大部分学习过数据库的人应该都了解幻读这个概念,我在这里帮大家复习下.以下都是以InnoDB存储引擎为例进行说明.数据库并发访问中,针对delete和insert操作可能出现幻读这种 ...
- 数据库 之 事务控制和隔离级别
1 概述 事务是指一组原子性的SQL查询.或者是一个或多个SQL语句组成的独立工作单元:MyISAM不流行的原因很大是因为其不支持事务的处理功能. 2 事务日志 事务日志定义属性,有些参数可以运行 ...
最新文章
- visual basic从入门到精通第三版cd_C++从零到精通,这才是你需要的书单!
- RandomForestClassifier参数min_samples_leaf和min_samples_split理解
- mysql安装到最后报错_mysql 安装到最后一步时,start service 为失败状态
- rxjs里scan operators的用法
- init/inittab
- Abbreviated biography of Jon Claerbout
- c语言学习-自定义并调用函数求三个数的最小公倍数
- vue 表单 input radio
- 第六章 应用层[练习题+课后习题]
- spark 算子使用类变量_Scala与Spark是天生的一对?
- rmd中无法打开链结r_小编详解 win7系统无法访问网络打印机的修复教程 -win7系统使用教程...
- 【华为浏览器如何安装扩展程序】
- 老友记台词学习笔记 SE01EP03(三)
- Qlikview---数据类型
- 基于遗传算法的卷积神经网络架构搜索
- 通过内存模拟硬盘实现一个简单的块设备驱动
- 实现购物车功能php,php 购物车功能实现代码(入门例子)
- c语言求玫瑰花数带注释,新人 用C语言画一朵玫瑰
- 【SVM分类】基于matlab哈里斯鹰算法优化支持向量机SVM分类【含Matlab源码 2243期】
- scrapy--(failed 3 times): [<twisted.python.failure.Failure twisted.web._newclient.ParseError
热门文章
- android 8三星note8,【三星GALAXYNote8评测】一出场就赢了 三星Note 8双摄深度解析_三星 GALAXY Note 8_手机评测-中关村在线...
- 在linux中查找重复的文件夹,如何查找(和删除)重复文件
- 烘焙管理者须警惕的九大错误
- Python打招呼函数
- xp系统宽带连接断开怎么连接服务器,winxp的怎样断开和启用连接_winxp系统如何随意断开和启用连接网络图文教程...
- 你了解EDIUS非线性编辑软件吗?
- 问题事件名称:	CLR20r3 解决方法
- 微信小程序开发学习--7.27日
- c语言课程设计情侣,C/C++编程笔记:C语言制作情侣必备《爱情电子相册》,源码解析!...
- 这几个相见恨晚的PDF转换成Word技巧,请收好