oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介

作者:甘植恳-Aken

PostgreSQL和Oracle、MySQL等RDBMS一样,都有自己的并发控制机制。而并发控制的目的是为了在多个事务同时运行时保持事务ACID属性。

MVCC即Multi-version concurrence control首字母缩写,MVCC会为每个数据更改操作创建数据块或数据行的新版本,同时保留旧版本,主要优点是:

'readers don't block writers,and writers don't block readers'

即“读不会阻塞写,而写也不会阻塞读”。

在Oracle中,多版本控制MVCC通过回滚段实现,当行记录row发生更改的时候,先将数据块的旧版本将写入回滚段,随后将新数据覆写入原data block数据块区域。在读取数据的时候,通过比对scn来读取合适的数据版本。

026560014e16a26e2e5a7fbdc2693c1b.gif

Oracle 19C Read Consistency in the Read Committed

相对Oracle来说,PostgreSQL的MVCC则使用更简单的方法来实现。当行记录tuple发生更改时候,新数据直接插入到原来的data page中。在读取数据的时候,PostgreSQL通过可见性规则读取合适的数据版本。

0b736aff81f69bf4fe5111bfb39b6def.png

Transaction ids in PostgreSQL

简单来说,PostgreSQL和Oracle在MVCC的实现上存在以下主要区别:

Oracle:基于SCN,块级别,循环undo segment实现,支持闪回功能,存在大事务回滚、快照过旧ORA-01555问题。

PostgreSQL:基于事务编号txid,行级别,无需undo,不支持闪回,大事务可瞬间回滚,存在数据块(data page)空间及性能消耗问题。

值得提出的是,去年Oracle中出现的SCN最大值预警问题,在PostgreSQL中通过txid循环复用来规避。

Oracle查看当前scn:

SQL> select current_scn from v$database;CURRENT_SCN-------------------- 698823298SQL>

PostgreSQL查看当前事务ID:

(postgres@[local]:5432)[akendb01]#select txid_current(); txid_current -------------- 636(1 row)

--查看行记录tuple 1的txid:

(postgres@[local]:5432)[akendb01]#insert into table01 values(1,'aken01');INSERT 0 1(postgres@[local]:5432)[akendb01]#select id,name, ctid,xmin,xmax from public.table01; id | name | ctid | xmin | xmax ----+--------+-------+------+------ 1 | aken01 | (0,1) | 636 | 0 

上面insert插入行记录Tuple 1,即id=1,该tuple的事务ID解析如下:

  • t_xmin:被设置为636,表示该tuple的版本在txid=636的事务中被插入。
  • t_xmax :被设置为 0,表示该tuple的版本未发生过deleted or updated.
  • t_ctid:被设置为(0.1),表示该tuple位于page 0的存储位置。这里的t_ctid和Oracle的rowid相似。

--下面对行记录tuple进行更改:

(postgres@[local]:5432)[akendb01]#insert into table01 values(2,'aken02');INSERT 0 1(postgres@[local]:5432)[akendb01]#update table01 set name='aken03' where id=2;UPDATE 1

--查看tuple id=2的事务txid:

(postgres@[local]:5432)[akendb01]#select id,name, ctid,xmin,xmax from public.table01;id | name | ctid | xmin | xmax ----+--------+-------+------+------ 1 | aken01 | (0,1) | 636 | 0  2 | aken02 | (0,2) | 638 | 639  2 | aken03 | (0,2) | 639 | 0(3 rows)(postgres@[local]:5432)[akendb01]#

上面对行记录Tuple 2即id=2执行update之后,tuple的事务ID解析如下:

版本1:旧版本:

  • t_xmin:被设置为638,表示该tuple的版本在txid=638的事务中被插入。
  • t_xmax :被设置为 639,表示该tuple的版本发生了deleted or updated,为旧版本.
  • t_ctid:被设置为(0.2),表示该tuple位于page 0的位置。这里的t_ctid和Oracle的rowid相似。

版本2:新版本:

  • t_xmin:被设置为639,表示该tuple的版本在txid=639的事务中被插入。
  • t_xmax :被设置为0,表示该tuple的版本未发生过deleted or updated.
  • t_ctid:被设置为(0.2),表示该tuple位于page 0的位置。这里的t_ctid和Oracle的rowid相似。

欢迎关注头条号查看Aken更多相关文章:

https://www.toutiao.com/c/user/54536888148/#mid=1610143870006285

参考资料:

https://www.postgresql.org/docs/12/mvcc.html

https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt

http://www.interdb.jp/pg/pgsql05.html

---本文完---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Microstation】不能从对话框中装载/创建类型为 ‘HTML‘,id =41510001 的对话框条目,该对话框为: “文本编辑器 - 字处理器“,GCSDIALOG 已装载。

在Win7上安装MicroStation V8i简体中文版,在添加文字图层的时候,点击出现提示“不能从对话框中装载/创建类型为 HTML,id =41510001 的对话框条目,该对话框为: "文本编辑器 - 字处理器",GCSDIALOG 已装载。”,问题出在Win7对该软件的兼容性上。 MS软件提供了三种…

fastdfs 一个group内实现按照不同的项目,指定路径存储.

为什么80%的码农都做不了架构师?>>> 环境介绍: 1: 公司目前有5个项目 A B C D E 日后可能会有所增加. 2: 使用fastdfs存储这5各项目的文件,要求各各项目的文件分开存储,也就是每个项目的文件存储到一个固定的位置. 3: 三台机器ip地址分配如下 tracker…

一个WPF开发的打印对话框-PrintDialogX

今天五月一号,大家玩的开心哦。1. 介绍今天介绍一个WPF开发的打印对话框开源项目-PrintDialogX[1],该开源项目由《WPF开源项目:AIStudio.Wpf.AClient》[2]作者推荐。欢迎使用 PrintDialogX, 这是一个开源项目。免费用于商业用途。用于 C# 的自…

这一新的可视化方法教你优雅地探索相关性

一个古老的诅咒一直萦绕着数据分析:我们用来改进模型的变量越多,那么我们需要的数据就会出现指数级的增长。不过,我们通过关注重要的变量就可以避免欠拟合以及降低收集大量数据的需求。减少输入变量的一种方法是鉴别其对输出变量的影响。变量…

【新手宝典】一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式,这篇博文很有可能是你的启蒙文

前言 本片博文主要面向于还没接触过web开发的萌新,以及想知道整体流程并且完成建站的萌新;如果你是个大佬,就没必要看下去了。 本篇博文没有难啃的骨头,请各位萌新放心食用。 本篇博文采用通俗易懂的方式讲解,轻松并…

MicroStation V8i简体中文版中文字体乱码解决办法

Bentley (奔特力)是一家软件研发公司,其核心业务是满足负责建造和管理全球基础设施,包括公路、桥梁、机场、摩天大楼、工业厂房和电厂以及公用事业网络等领域专业人士的需求。Bentley 在基础设施资产的整个生命周期内针对不同的职业,包括工程师、建筑师、规划师、承包商、…

惠普ProDesk行业专用台式机U盘不识别解决办法

惠普ProDesk行业专用台式机在使用的过程当中,老出现插入U盘不识别的问题,总是需要在重启的过程中插入U盘才能使用U盘,解决办法是:(1)打开设备管理器,如下图所示:(2&#…

【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解

本篇作为Windows API 系列文章的第一篇,将简要的讲解一下什么是Windows API,Windows API能做些什么,并且尽可能讲解一些新出现的专有名词;本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容&…

中国人工智能学会通讯——基于视频的行为识别技术 1.1 什么是行为

今天跟大家分享的主题是基于视频的 行为识别领域研究,主要介绍一下早期 的非深度学习传统方法和近期深度学习 方法取得的结果。深度学习方法带来了 非常大的变革,提升了识别系统的性能, 但这并不意味着我们把传统的东西都要 抛弃,…

Windows 11 22H2 22610 重磅发布!删除水印,多彩任务管理器,文件资源管理器深度优化...

面向 Dev 和 Beta 频道的 Windows 预览体验成员,微软现已发布 Windows 11 22H2 预览版 Build 22610。主要变化1.微软现已更新 Windows 11 任务管理器的进程页面,将随着 Windows 主题颜色而变化。2.微软现已更新锁屏上的电池图标,适配 Windows…

一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!

Turtle库手册可以查询查询 python图形绘制库turtle中文开发文档及示例大全,手册中现有示例,不需要自己动手就可以查看演示。 文章修改记录 修改记录 1:2020年5月17日 12:06:51 由于某些童鞋回复说自己会卡死,请把代码&#xff…

阿里云500服务器内部错误,腾讯云服务器网站不能打开 提示内部错误http 500

满意答案2010qqww2015.11.14采纳率:55% 等级:9已帮助:13114人实服务器内部500错误大概可分为两种,一种是服务器本身权限问题,另一种是程序上不规范或者错误造成。所以要解决此问题需要先弄清楚其到底是哪种原因&…

Hadoop(四)C#操作Hbase

HbaseHbase是一种NoSql模式的数据库,采用了列式存储。而采用了列存储天然具备以下优势:可只查涉及的列,且列可作为索引,相对高效针对某一列的聚合及其方便同一列的数据类型一致,方便压缩同时由于列式存储将不同列分开存…

【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进步!谢…

一行命令 优化上传速度

本文来自 fir.im 首席吉祥物 TraWor. 最近许多用户反映上传速度慢的一塌糊涂,七牛的上传带宽我想肯定是没问题的,那原因不必多想就剩下 DNS 了。 即便本地网络再快,DNS 服务器给了一个很远的服务器地址也没办法很快的上传。 在终端运行这一行…

go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码

大家好,我是彬哥,本节给大家讲下LollipopGov1.0.20190102版本游戏服务器globla服务器,抛砖引玉了,主要是针对Go语言游戏服务器Global服务器处理。package mainimport ("LollipopGo/LollipopGo/conf""LollipopGo/Lo…

ArcGIS导入Sketchup模型

ArcGIS可以与Sketchup、3D Studio Max等三维软件完美进行交互。 ArcGIS可以借助 Import 3D Files 工具支持主流的三维模型导入。支持 3D Studio Max (*.3ds)、VRML and GeoVRML 2.0 (*.wrl)、SketchUp 6.0 (*.skp)、OpenFlight 15.8 (*.flt)、Collaborative Design Activity (C…

剑指offer之两个队列实现栈的问题

1 问题 两个队列实现栈的插入和获取头部元素的功能 2 分析 1)获取头部元素的功能分析: 我们有2个队列,我们知道队列的特点的先进先出,而栈的特点是先进后出,比如我们有数据1,2,3,4,我们分别依次压入队列1&#xff0…

solr的空间查询(查询地图周围坐标)

原文网址:http://www.cnblogs.com/hanhuibing/articles/5680616.html 基于Solr的空间搜索 如果需要对带经纬度的数据进行检索,比如查找当前所在位置附近1000米的酒店,一种简单的方法就是:获取数据库中的所有酒店数据,…

「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld

环境说明 操作系统:Windows7 SP1 编辑器说明: Python:notepadC:devcC sharp(C#):Visual Studio2019 注意: 标点:在编程中要使用英文的标点符号,必须切记数…