百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

多版本并发控制(MVCC)与一致性读(二)

mhr18 2024-12-27 16:19 12 浏览 0 评论

上篇介绍了执行update语句,undo中保存的信息。今天我们再看看执行delete和insert时,undo中保存了什么。

执行一条delete语句

dump出undo块,查看trace文件

undo块中第7条记录记录了此事务的回滚信息

记录了两列信息,转换成文本后,正好是8 和name8。由此可见当执行delete语句时,undo中记录的是删除的行的所有字段的值。

执行一条insert语句,记住编号100,表示这行数据在数据块中的位置。

dump出undo块,查看trace文件

查看undo块中第2条记录信息

KDO Op code: DRP --表示操作类型,DRP=delete row piece

bdba: 0x01800417 --对应的数据文件和块,转换成二进制,前10位为数据文件号,后22位为块号 ,6 号数据文件,1047号块。

slot: 100(0x64) --行在数据块中的位置,与上面select出来的row number正好对应。

由此可见,当执行insert时,undo中只会记录回滚时需要的操作DRP,和数据行的位置。


总结:

update、insert、delete操作时,undo中记录的信息不一样。insert时,只记录了插入数据在数据块中的位置。update时,记录的是修改字段的前镜像值。delete时,记录的是整行数据。insert记录的信息最好,update记录的信息居中,delete记录的信息最多。因此,执行delete操作需要更多的undo空间记录回滚信息,回滚时需要从undo中拷贝更多的数据到数据块中,因此,delete操作的代价最昂贵。


如果在同一个事务里,对某一行数据的某一个字段值进行了多次修改,如将name='a'修改为name='b',再改为name='c',最后改成name='d',此时undo中会记录每一次的修改信息呢,还是只记录最后一次修改的信息呢?

查看undo块信息

查看第6条undo记录

col 1: [ 1] 63 --转换成字符为c

rci 0x05 -- 指向同一个事务的上一条undo记录

依次转换col 1的值为字符得到 c->b->a->name1,正好与更新的顺相反,一次撤销即可实现回滚。rci 0x00表示本事务的第一条记录。

因此可以得出如下结论:

在同一事务里,对某一个字段值反复更新,undo会记录每次操作的前镜像值,即会记录中间结果。


介绍了这么多undo的内容,是因为Oracle的多版本并发控制(MVCC)与一致性读是通过undo实现的。MVCC简单来说就是在同一时刻,数据有多个版本,不同的会话可以获取不同版本的数据。一致性读是在同一时刻,其他会话不能看到本话会修改但是未提交的数据,这是为了避免脏读。其他会话看到的是当前内存中的数据块和undo块构造的包含数据修改前的旧数据的一致性数据块,因此称为一致性读。构造一致性读数据块的过程就是先读取内存中实际的数据块,再根据undo记录的条目,逐条地回滚到指定的时刻,即完成了数据的回滚操作。通过构造一致性读数据块,读不会影响写操作,写也不会影响读操作,极大地提高了数据块的并发能力。Oracle的闪回功能也是通过undo来实现的。

相关推荐

2025最新指南:Quarkus整合Redisson,轻松玩转分布式锁!

分布式系统的高并发场景下,如何确保资源操作的原子性和一致性?Redisson作为Redis官方推荐的分布式锁方案,结合Quarkus的云原生特性,能实现高性能、低延迟的分布式锁管理。本文将从原理到实战...

Linux进程上下文切换过程context_switch详解

1前言1.1Linux的调度器组成2个调度器可以用两种方法来激活调度一种是直接的,比如进程打算睡眠或出于其他原因放弃CPU另一种是通过周期性的机制,以固定的频率运行,不时的检测是否有必要因此...

开发10年面试过上千人,在网易面试Java程序员,我最爱问这些问题

在网易当了3年的面试官,一般在面试Java程序员的时候,我主要会从这几个角度,去问这些问题,在这篇文章中,我会用我上一位面试过程来为大家总结,我面试的时候爱问的这些问题!有需要面试的小伙伴可以参考一下...

电影票务APP的“座位锁定”,Redis如何避免冲突?

现在买电影票,真是越来越方便了!再也不用提前老半天跑去电影院排队,在手机APP上动动手指,选好场次、挑好座位,在线支付,一气呵成。尤其是遇到热门大片,或者想抢个“皇帝位”(中间靠后视野好的位置),那个...

Serverless架构下,Redis的用武之地在哪里?

在云计算的演进浪潮中,Serverless(无服务器)架构无疑是一颗璀璨的明星。它将传统服务器的运维复杂性彻底“隐藏”起来,开发者只需关注核心业务逻辑,编写一个个独立的函数(Function-as-a...

高可用聊天系统设计方案(Hyperf实现)

一、系统架构设计1.分层架构图客户端↑↓HTTP/WSAPI网关层(Nginx+Keepalived)↑↓RPC业务服务集群↑↓数据层(MySQLClus...

大厂面试冲刺,Java“实战”问题三连,你碰到了哪个?

推荐学习全网首发!马士兵内部共享—1658页《Java面试突击核心讲》狂刷《Java权威面试指南(阿里版)》,冲击“金九银十”有望了Java“实战”问题三连Java“实战”面试题1:如果用mybati...

企业开发必备的6个Spring Cloud微服务开源项目

今天介绍六款比较热门的SpringCloud微服务项目,感兴趣的可以clone下来研究一下,相信对你学习微服务架构很有帮助。一、Cloud-Platform介绍Cloud-Platform是国内首个基...

系统架构设计方法论:系统演进的四重境界

在架构师面试中,设计能力的考察本质是验证候选人如何将混沌需求转化为可落地的技术方案。这不仅需要扎实的技术功底,更需要系统化的设计思维。以下四大步骤,既是架构设计的核心框架,也是技术决策的动态沙盘推演。...

跨浏览器共享Session信息方法总结

在不同浏览器之间共享Session信息需要克服浏览器间的隔离机制,常见解决方案如下:1.基于Token的跨浏览器传递实现方式:用户在主浏览器生成临时Token(如加密URL或二维码)。其他浏览器通过...

如何设计一套单点登录系统

一、介绍昨天介绍了API接口设计token鉴权方案,其实token鉴权最佳的实践场景就是在单点登录系统上。在企业发展初期,使用的后台管理系统还比较少,一个或者两个。以电商系统为例,在起步阶段,可能只有...

SpringBoot实现单点登录几种方案

前言:单点登录(SingleSign-On,SSO)是企业应用系统中常见的用户认证方案,它允许用户使用一组凭证访问多个相关但独立的系统,无需重复登录。基于Cookie-Session的传统SSO方案...

零基础小白如何学爬虫技术?看一遍就会的详细教程!

你以为爬虫需要精通编程、算法、网络协议才能入门?错了。作为零基础的小白,你完全可以在3周内学会主流网站的数据抓取,核心秘诀就两点:拆分具体目标+倒推式学习。与其纠结Python语法、HTTP协议这...

探秘Java中的分布式锁:优雅地协调分布式系统

探秘Java中的分布式锁:优雅地协调分布式系统在分布式系统的架构中,数据一致性是一个永恒的挑战。当我们需要在多个节点之间协调某些操作时,分布式锁便成为了一种不可或缺的工具。它就像一把钥匙,能够控制对共...

一文读懂 Spring Boot 3 分布式事务解决方案

在当今复杂的业务架构中,分布式事务处理是关键难题之一。随着业务规模的不断扩张,系统架构从单体逐渐演进为分布式,这就要求开发人员能够熟练掌握高效的分布式事务解决方案,以保障数据的一致性和业务的稳定性。今...

取消回复欢迎 发表评论: