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

Postgresql的ddl在事务中可以回滚,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

相关文章:

  • Apache ActiveMQ RCE漏洞复现(CNVD-2023-69477)
  • Windows上配置IP端口转发
  • css矩形盒子实现虚线流动边框+css实现step连接箭头
  • MySQL WITH AS及递归查询
  • 数据结构和算法——用C语言实现所有排序算法
  • C# WPF: Imag图片填充方式有哪些?
  • Docker 容器服务的注册、发现及Docker安全
  • 十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)
  • 10.25verilog复习,代码规范复盘,触发器复习
  • Day 4 登录页及路由 (二) -- Vue状态管理
  • 边缘计算技术的崭新篇章:赋能未来智能系统
  • 在Spring boot中 使用JWT和过滤器实现登录认证
  • 【年终特惠】全流程HEC-RAS 1D/2D水动力与水环境模拟技术案例实践及拓展应用
  • 9.Python3-注释
  • 20年经典传承 | 性能圣典!火焰图发明者Brendan Gregg“神作”
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • ECMAScript6(0):ES6简明参考手册
  • ES6 学习笔记(一)let,const和解构赋值
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • javascript数组去重/查找/插入/删除
  • JS函数式编程 数组部分风格 ES6版
  • nginx 负载服务器优化
  • Puppeteer:浏览器控制器
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • select2 取值 遍历 设置默认值
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 电商搜索引擎的架构设计和性能优化
  • 浮动相关
  • 回流、重绘及其优化
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 你不可错过的前端面试题(一)
  • 使用agvtool更改app version/build
  • 国内开源镜像站点
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #Linux(权限管理)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (c语言)strcpy函数用法
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (四) Graphivz 颜色选择
  • ./和../以及/和~之间的区别
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @ConfigurationProperties注解对数据的自动封装
  • @Transaction注解失效的几种场景(附有示例代码)
  • [@Controller]4 详解@ModelAttribute
  • [383] 赎金信 js
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [FC][常见Mapper IRQ研究]
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [idea]关于idea开发乱码的配置
  • [Java开发之路](14)反射机制
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [LeetCode周赛复盘] 第 312 场周赛20220925