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

Postgresqlddl在事务中可以回滚,truncate时relfilenode在当前会话会改变

Postgresql的事务里面ddl可以回滚,这点和oracle不太一样。其中postgresql alter table事务操作中,包括回滚的整个过程中表对象的relfilenode不变,但是postgresql truncate事务操作中,一旦执行truncate操作表对象的relfilenode在当前会话就变了,其他会话查询表对象的relfilenode没有变化,truncate事务操作回滚后表对象的relfilenode在当前会话中也回滚了

Postgresql的事务里面ddl可以回滚,如下新增字段操作的ddl回滚后,新增的字段就消失了

postgres=# select * from emp;id  |  name  | position | managerid | yearmomthday | salary | ticheng | salper
------+--------+----------+-----------+--------------+--------+---------+--------7369 | SMITH  | CLERK    |      7902 | 1982-12-17   |    800 |         |     207499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     207521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     307566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     207654 | MARTIN | SALESMAN |      7698 | 1982-09-28   |   1250 |    1400 |     30
(5 rows)postgres=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16412 | emp     |       16412
(1 row)postgres=# begin;
BEGIN
postgres=# alter table emp add column lx varchar(100) default 'good';
ALTER TABLE
postgres=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16412 | emp     |       16412
(1 row)postgres=# select * from emp;id  |  name  | position | managerid | yearmomthday | salary | ticheng | salper |  lx
------+--------+----------+-----------+--------------+--------+---------+--------+------7369 | SMITH  | CLERK    |      7902 | 1982-12-17   |    800 |         |     20 | good7499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     20 | good7521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     30 | good7566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     20 | good7654 | MARTIN | SALESMAN |      7698 | 1982-09-28   |   1250 |    1400 |     30 | good
(5 rows)postgres=# rollback;
ROLLBACK
postgres=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16412 | emp     |       16412
(1 row)postgres=# select * from emp;id  |  name  | position | managerid | yearmomthday | salary | ticheng | salper
------+--------+----------+-----------+--------------+--------+---------+--------7369 | SMITH  | CLERK    |      7902 | 1982-12-17   |    800 |         |     207499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     207521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     307566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     207654 | MARTIN | SALESMAN |      7698 | 1982-09-28   |   1250 |    1400 |     30
(5 rows)

Postgresql的事务里面ddl可以回滚,如下truncate操作,回滚后,truncate的数据又回来了

testdb=# select * from emp;id  |  name  | position | managerid | yearmomthday | salary | ticheng | salper
------+--------+----------+-----------+--------------+--------+---------+--------7369 | SMITH  | CLERK    |      7902 | 1982-12-17   |    800 |         |     207499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     207521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     307566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     207654 | MARTIN | SALESMAN |      7698 | 1982-09-28   |   1250 |    1400 |     30
(5 rows)testdb=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16400 | emp     |       16400
(1 row)testdb=# begin;
BEGIN
testdb=# truncate table emp;
TRUNCATE TABLE
testdb=# select * from emp;id | name | position | managerid | yearmomthday | salary | ticheng | salper
----+------+----------+-----------+--------------+--------+---------+--------
(0 rows)testdb=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16400 | emp     |       24610
(1 row)testdb=# rollback;
ROLLBACK
testdb=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16400 | emp     |       16400
(1 row)testdb=# select * from emp;id  |  name  | position | managerid | yearmomthday | salary | ticheng | salper
------+--------+----------+-----------+--------------+--------+---------+--------7369 | SMITH  | CLERK    |      7902 | 1982-12-17   |    800 |         |     207499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     207521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     307566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     207654 | MARTIN | SALESMAN |      7698 | 1982-09-28   |   1250 |    1400 |     30
(5 rows)

truncate会话执行过程中ll -rt |grep 24610能查到relfilenode 24610

[root@centos7 16386]# ll -rt |grep 24610
-rw-------. 1 postgres postgres      0 Oct 29 20:55 24610

不过会话退出后不久,ll -rt |grep 24610就查不到对应的文件了

[root@centos7 16386]# ll -rt |grep 24610
[root@centos7 16386]# 

在会话1执行truncate的过程中只要还没提交,其他会话查询到表的relfilenode不变

postgres=# select oid,relname,relfilenode from pg_class where relname='emp';oid  | relname | relfilenode
-------+---------+-------------16412 | emp     |       16412

相关文章:

  • 《嵌入式软\硬件开发难点-2023-10-29》
  • 基于Qt 文本读写(QFile/QTextStream/QDataStream)实现
  • LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
  • volatile 系列之如何解决可见性问题
  • 【C++代码】爬楼梯,不同路径,整数拆分,不同搜索树,动态规划--代码随想录
  • QT C++ AES字符串加密实现
  • 设计模式中继承和组合的总结
  • MyString字符串类
  • TOGAF(企业架构)
  • VSCode snippets
  • Android11系统桌面隐藏指定APP图标
  • nginx请求时找路径问题
  • NetSuite数据备份办法
  • Day 11 python学习笔记
  • Linux系统下配置王爽汇编语言环境
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【个人向】《HTTP图解》阅后小结
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • eclipse(luna)创建web工程
  • HTML5新特性总结
  • Python 基础起步 (十) 什么叫函数?
  • React Native移动开发实战-3-实现页面间的数据传递
  • webpack入门学习手记(二)
  • 对象管理器(defineProperty)学习笔记
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用SAX解析XML
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​业务双活的数据切换思路设计(下)
  • # 数据结构
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #mysql 8.0 踩坑日记
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (转)Google的Objective-C编码规范
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET/C# 使窗口永不获得焦点
  • .NET6实现破解Modbus poll点表配置文件
  • /bin/rm: 参数列表过长"的解决办法
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @SuppressWarnings注解
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [Android]使用Android打包Unity工程
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [C++]高精度 bign (重载运算符版本)
  • [C语言]——柔性数组
  • [Django ]Django 的数据库操作
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [iOS]-UIKit
  • [JDBC-1] JDBC Base Template
  • [Luogu P3527BZOJ 2527][Poi2011]Meteors(整体二分+BIT)
  • [mysql] mysqldump 导出数据库表
  • [NOIP2004] 提高组 洛谷P1090 合并果子
  • [pasecactf_2019]flask_ssti proc ssti config