当前位置: 首页 > news >正文

PostgreSQL回滚TRUNCATE操作的原理

       下午大家在讨论pg可以回滚truncate操作,好奇原理是怎么样的,搜到的大部分文章只提到了“事务DDL”的概念,没有详细介绍。后来找到两篇文章,整理并测试了一下主要内容。

一、 回滚原理

       在 Oracle中,多个表和索引存储在由一个或多个数据文件组成的表空间中,但在 PostgreSQL 中,通常将每个对象存储为一个 OS 上的文件,例如表或索引。

       在 PostgreSQL 中执行 TRUNCATE 时,会为目标表创建一个新的物理文件,之后该事务会话引用这个新的物理文件,而其他会话引用旧文件(查询对应表会被阻塞)。旧物理文件通过pendingDeletes机制一直保留到执行TRUNCATE 的事务提交(实际是在提交的一段时间之后)。如果执行回滚,则改回引用旧文件,此时便可快速回滚truncate操作。

二、 实验测试

创建测试表

查看表的OID及relfilenode

select oid,relfilenode from pg_class where relname = 'tmp0831';

对应物理文件

1. 回滚测试

从另一个会话(会话 2)启动事务,并truncate表。

begin;
truncate table tmp0831;
select count(*) from tmp0831;

      

查询relfilenode,发现已经变了

说明对应的物理文件已经变了

会话1查询tmp0831表行数,发现被阻塞  

查询relfilenode,还是旧的

会话2回滚truncate操作,再查relfilenode,发现变回来了

2. 自动提交测试

关闭事务,会话2再次 truncate,此时会自动提交

可以看到这次会话1的也跟着变了

查看物理文件,会发现之前的16429和16435都没有了,只有最新的16438,tmp0831表目前就引用该文件。

符合前面提到的原理

参考

https://dev.classmethod.jp/articles/postgresql-internal-truncate/

http://www.nminoru.jp/~nminoru/postgresql/pg-table-and-block-structure.html#relation-file-node

相关文章:

  • 缓存穿透、缓存击穿、缓存雪崩
  • HIVE自定义UDAF函数
  • java计算机毕业设计基于安卓Android的校园助手APP
  • 计算机网络笔记(王道考研) 第四章:网络层
  • MySQL必知必会---检索数据
  • ORACLE认证课程
  • emplace()
  • 【代码随想录】回溯算法刷题
  • Pyhon——datetime、calendar模块
  • 爆刷leetcode——链表(二)
  • 【翻译】Style-Aware Normalized Loss for Improving Arbitrary Style Transfer
  • Spring的component-scan XML配置和@ComponentScan注解配置
  • Java 基础知识回顾(一)
  • shell脚本之函数的引入
  • JDK的下载与安装详细教程
  • C++11: atomic 头文件
  • Git同步原始仓库到Fork仓库中
  • JAVA SE 6 GC调优笔记
  • Java 多线程编程之:notify 和 wait 用法
  • Java到底能干嘛?
  • Python_OOP
  • Spring Boot快速入门(一):Hello Spring Boot
  • Vue 动态创建 component
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 类orAPI - 收藏集 - 掘金
  • 浏览器缓存机制分析
  • 使用权重正则化较少模型过拟合
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • (1) caustics\
  • (2)STL算法之元素计数
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C++)八皇后问题
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (数据结构)顺序表的定义
  • (一)u-boot-nand.bin的下载
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET 5种线程安全集合
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6使用Sejil可视化日志
  • .net操作Excel出错解决
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • []sim300 GPRS数据收发程序
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [C puzzle book] types
  • [dart学习]第四篇:函数