可重复读(Repeatable read)能防住幻读吗?
文章目录
- 可重复读(Repeatable read)能防住幻读吗?
- 事务隔离级别
- 事务的并发问题
- 概念
- 幻读和不可重复读的区别
- 乐观锁与悲观锁
- 悲观锁
- 乐观锁
- 数据版本
- MVCC
- 当前读
- Next-Key锁
可重复读(Repeatable read)能防住幻读吗?
事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | √ | √ | √ |
读已提交(read-committed) | × | √ | √ |
可重复读 (repeatable-read) | × | × | √ |
串行化 (serializable) | × | × | × |
- 事务隔离级别为读已提交时,写数据只会锁住相应的行。
- 事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
- 事务隔离级别为串行化时,读写数据都会锁住整张表。
- 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
mysql默认的事务隔离级别为 repeatable-read
Oracle默认 读已提交(read-committed)
select @@tx_isolation;
set tx_isolation = '';
--jdbc 设置(1 2 4 8)
Connection.setTransactionIsolation(int level)
事务的并发问题
概念
- 脏读: 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。(回滚造成)
- 不可重复读: 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。(提交造成)(update)
- 幻读: 前后多次读取,数据总量不一致。(delete、insert)
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于插入或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
幻读和不可重复读的区别
- 不可重复读: 重点是修改,在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(一个事务多次读取同一范围内数据时,另外一个发生了事务发生insert操作并提交了)。数据变化。
- 幻读: 重点在于插入或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(一个事务多次读取同一条数据时,另外一个发生了事务发生insert,delete操作并提交了。update操作一条新数据并不会影响刚才被读的那条数据。)。行数变化。
乐观锁与悲观锁
悲观锁
悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。悲观的认为,不加锁的并发操作一定会出问题。
乐观锁
乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为,不加锁的并发操作是没有事情的。
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但是这样会带来极大的数据库性能开销,对于长事务来说,这种开销是无法承受的。
悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。
数据版本
乐观锁大多是基于数据版本实现。
数据版本即为为数据增加一个版本标识,一般是为数据库表增加一个“version”字段来实现。读取出数据时,会将该版本号一同带出,之后更新时,版本号+1。提交数据的版本数据与数据库表对用的记录的当前版本信息进行对比,如果提交的数据版本号大于当前数据库表的版本号,则进行更新操作,否则会认为其是过期数据。
MVCC
在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期或者被删除。
在可重复读 (repeatable-read)事务隔离级别下:
- select:读取创建版本号<=当前事务版本号。
- INSERT时,保存当前事务版本号为行的创建版本号。
- DELETE时,保存当前事务版本号为行的删除版本号。
- UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行。
每行记录都需要额外的存储空间来记录version,增加了行检查与维护工作,但是可以减少锁的适用,读取数据操作简单,性能好。通过MVCC读取的数据其实是历史数据,而不是最新数据。这种读取数据的方式叫做快照读(snapshot reda),只使用select时就是快照读。
当前读
update、insert、delete都是采用的当前读的方式。
Next-Key锁
B+树的特点是所有数据都存储到叶子节点上,当我们对某条数据进行更新后,就会对这条数据加行锁,能够防止其他事务对其进行update与delete,还会加GAP锁。而它的前后并没有锁住,这样就极大的提高了数据的并发能力。**
可重复读(Repeatable read)能防住幻读吗?相关推荐
- MySQL面试三连杀:如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...
作者 | sanyuesan0000 来源 | https://blog.csdn.net/sanyuesan0000 事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读 ...
- MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介)
MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介) 一.MCVV简介 二.可重复读隔离级别能解决幻读? 三.什么是当前读和快照读? 四.MVCC的实现原理 五.RC,RR级别下的InnoD ...
- Mysql可重复读隔离级别下如何解决幻读
Mysql可重复读隔离级别下如何解决幻读 一些概念 具体加锁说明 使用主键索引进行等值查询 使用主键索引进行范围查询 使用二级索引进行等值查询 使用二级索引进行范围查询 一些概念 幻读:在一次事务中, ...
- 深入学习InnoDB可重复读隔离级别下如何避免幻读
一.InnoDB可重复读隔离级别下如何避免幻读 在理解什么是幻读之前,先了解下脏读.幻读.不可重复读在实操场景中的现象. 脏读:指的就是一个事务读取到了另一个事务还未提交的数据,当该事物将数据回滚,则 ...
- MySQL可重复读级别会不会造成幻读
一.定义 在<高性能MySQL>一书中,是这样描述的 根据书上的描述,MySQL的可重复读隔离级别通过MVCC机制,解决了幻读的问题,所以不会造成幻读 二.测试 本文默认你已经知道以下的命 ...
- 数据库之InnoDB可重复读隔离级别下如何避免幻读
文章目录 一.先介绍几个概念 1.什么是当前读 2.什么是快照读 3.什么是mvcc 二.RR级别下避免幻读的方法 三.RC级别下测试快照读和当前读 3.1.测试快照读 3.2.测试当前读 四.RR级 ...
- 专题-子项-1-mysqlf-默认隔离级别为什么是可重复读?为什么业务代码建议用读已提交?
经典参考:https://blog.csdn.net/java_collect/article/details/105042975 binlog有几种格式? 三种,分别是 ----statement: ...
- MySQL 可重复读隔离级别,完全解决幻读了吗?
我在上一篇文章中提到,MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种: 针对快照读(普通 select 语句),是通 ...
- mysql串行化防幻读原理_透彻解读mysql的可重复读、幻读及实现原理
目录 一.事务的隔离级别 二.mysql怎么实现的可重复读 举例说明MVCC的实现 MVCC逻辑流程-插入 MVCC逻辑流程-删除 MVCC逻辑流程-修改 MVCC逻辑流程-查询 三.幻读 快照读和当 ...
最新文章
- day8--socketserver
- 【python图像处理】彩色映射(续篇)
- 音视频技术开发周刊 | 186
- configuration 命名空间_kubernetes30:monitoring命名空间处于Terminating状态的处理方法...
- 【转载】【面试题】你是一个测试工程师,如何保证软件质量?
- mysql bin.000047_mysql-bin.0000X 日志文件处理
- jQuery函数的等价原生函数代码示例
- mysql 实例启动利用binlog恢复_mysql利用binlog进行数据恢复
- SAP License:生产订单状态
- 开放地址法开放地址法
- PMP考试参加培训一定能过吗?
- matlab高等数学实验答案,MATLAB高等数学实验-(第2版)
- PCBlayout设计
- Win7自带的壁纸路径
- iOS第三方支付集成-支付宝支付
- android后台前台切换,Android 把后台应用切换到前台
- 计算机无法检测到键盘,电脑检测不到键盘怎么办
- 2022这一年:阳了、变轨和逆风
- ElasticSearch基础介绍:5:可视化工具之cerebro
- 怎么关闭win10虚拟机服务器,大神为你win10系统彻底关闭退出vmware虚拟机的方案...
热门文章
- Python爬虫解析奥斯卡最佳影片《寄生虫》
- 李宏毅机器学习2-回归
- 皮卡丘为什么不进化_宝可梦:为何23年来小智的皮卡丘无法进化?怎样分辨皮卡丘性别?...
- 【pytest】(三) pytest中的fixture (2) : fixture的声明和调用
- 中科院考研经历(十三)--倒计时37天心态平复及后续计划
- P10:数组传递下标,删除数组数据
- node基础4-- MySQL的使用和前后端的身份认证
- 游戏3D建模师是一个什么样的职业
- 如何去写好公众号文章开头和结尾呢?
- 根据月份和天来去查找对应的星座