作者:甘植恳-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来读取合适的数据版本。

Oracle 19C Read Consistency in the Read Committed

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

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

---本文完---

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

  1. PostgreSQL 的 MVCC 机制解析

    为什么80%的码农都做不了架构师?>>>    导语 PostgreSQL是通过MVCC(Multi-Version Concurrency Control)来保证事务的原子性和隔离 ...

  2. oracle+事务开始+结束,Oracle事务和对象上集(视图、索引)

    一.Oracle事务 ·事务的含义:事务是业务上的一个逻辑单元,为了保证数据的所有操作要么全部完成,要么全部失败. 1.事务的开始是从一条SQL语句开始,结束于下面的几种情况: 1)显示提交:输入co ...

  3. oracle 抽样_利用ORACLE实现数据抽样

    做数据分析的,免不了碰到记录数据量很大,怎么办? 做全面分析是不现实也没有必要. 介绍一下抽样方法及实现 几种常用的抽样方法: 1.简单随机抽样(simple random sampling) 将所有 ...

  4. oracle 抽样_利用ORACLE实现数据抽样(sample block)

    转自:http://blog.sina.com.cn/s/blog_4b13ec250100wm14.html 做数据分析的,免不了碰到记录数据量很大,怎么办? 做全面分析是不现实也没有必要. 介绍一 ...

  5. cast函数 oracle 日期_从Oracle到PG 该做的改造工作一个都不能少!

    作者  Iris   (PG深度爱好者) 一.项目描述 前段时间刚完成一个应用ORACLE改造的项目,数据体量比较大,业务改造的周期计划比较短,再加上自研分布式MYSQL对事务.存储过程等限制,所以应 ...

  6. oracle事务操作例子,oracle 事务 与 提交

    一般事务(DML)即数据修改(增.删.改)的事务 事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作. 当事务被提交或回滚后,这些数据才会被释放锁. 举个 ...

  7. oracle 事务阻塞,一个Oracle会话严重阻塞的案例

    环境: os rhel 5.3 dbms 三节点 Oracle 10g rac ver  10.2.0.4 现象: 某些工作站死机或网络异常后,特定的收费人员在ZLHIS中收费时,点击确定后,程序无响 ...

  8. oracle事务数统计,Oracle 查询事务数

    查询"的" 首先想到的是v$transaction, 确认这个思路是否正确: 执行下面语句: SQL> select * from v$transaction; no row ...

  9. java连接oracle失败_程序连接oracle数据库失败

    navicat可以连接oracle数据库,但是程序连接报错,在完成一下几个步骤后,一切正常了: 1.D:\AfterInstall\instantclient-basic-windows.x64-12 ...

最新文章

  1. 两篇文章说中断和异常之一
  2. 图像的泊松(Poisson)编辑、泊松融合完全详解
  3. 详细记录如何在跨域请求中携带cookie
  4. 揭开SAP Customer Management for S/4HANA的神秘面纱
  5. search.php制作,重写搜索Search类
  6. WCF Rest Service
  7. python coding utf-8_【转】怎么在Python里使用UTF-8编码
  8. 从char到QChar
  9. Linux_CentOS 7下Nginx服务器的安装配置
  10. ubuntu18.04系统ros melodic 安装orbslam2,Astra相机的ROS环境
  11. (面试必知)必知必会的冒泡排序和快速排序
  12. Ubuntu 16.04系统下出现搜狗拼音安装失败问题
  13. jupyter中markdown模式编辑文本格式
  14. Win11 PE下如何快速设置IP如何新建共享文件夹并设置为everyone完全控制权限
  15. 金丹期前期:1.11、python语言进阶-网络
  16. 昊鼎王五:网站(前端)如何调用美图秀秀?
  17. 企业如何借助制造业ERP系统,做好生产排产管理?
  18. bing每日壁纸客户端
  19. Android获取百度音乐的音乐下载地址和歌词下载连接
  20. 团购三巨头承诺“誓言”:诚意够足,效率如何?

热门文章

  1. 如何在 ASP.NET Core 中使用 HttpClientFactory ?
  2. 如何优雅的移植JavaScript组件到Blazor
  3. 搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目
  4. [Student.Achieve] 学生教务管理系统开源
  5. 解惑小微企业信息化系统上云的顾虑
  6. 需求与问题——一个老现象
  7. Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会
  8. 使用.Net Core CLI命令dotnet new创建自定义模板
  9. 3分钟了解数据库事务
  10. 代码整洁之道(Clean Code)- 读书笔记