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

news/2024/7/9 23:13:19 标签: postgresql

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 |         |     20
 7499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     20
 7521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     30
 7566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     20
 7654 | 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 | good
 7499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     20 | good
 7521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     30 | good
 7566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     20 | good
 7654 | 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 |         |     20
 7499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     20
 7521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     30
 7566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     20
 7654 | 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 |         |     20
 7499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     20
 7521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     30
 7566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     20
 7654 | 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 |         |     20
 7499 | ALLEN  | SALESMAN |      7698 | 1981-02-20   |   1600 |     300 |     20
 7521 | WARD   | SALESMAN |      7698 | 1981-02-22   |   1250 |     500 |     30
 7566 | JONES  | MANAGER  |      7389 | 1981-04-02   |   2975 |         |     20
 7654 | 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

http://www.niftyadmin.cn/n/5136579.html

相关文章

第二证券:高送转股票是什么?股票高送转之后股价会怎样?

在上市公司增发股票、股票分红时,我们常常听到高送转股票这个词。那么,高送转股票是什么?股票高送转之后股价会怎样?下面希财君为我们准备了相关内容,以供参阅。 高送转股票是什么? 高送转是一个股票术语&…

15.k8s集群防火墙配置

防火墙配置 ######################## # master节点防火墙设置 ######################### 所有master节点开放相关防火墙端口 $ firewall-cmd --zonepublic --add-port6443/tcp --permanent $ firewall-cmd --zonepublic --add-port2379-2380/tcp --permanent $ firewall-cmd…

2023-09-09 青少年软件编程(C语言)等级考试试卷(五级)解析

2023-09-09 青少年软件编程(C语言)等级考试试卷(五级)解析T1、红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 时间限制:1000 内存限制…

null,undefined的区别?

在 JavaScript 中,null 和 undefined 都表示没有值或缺失值的状态,但它们之间有一些区别。 null: null 是一个表示空值的特殊关键字。它是一个表示变量未赋值的值,可以将其赋给任何变量,表示该变量为空。使用 null 可以明确地将一个变量设置为空。 示例: let myVaria…

AD教程(二)元件库(原理图库)介绍及电阻容模型的创建

AD教程(二)元件库(原理图库)介绍及电阻容模型的创建 元件模型组成 主要由元件边框、管脚(包括管脚序号和管脚名称)、元件名称和元件说明组成,对尺寸大小没有严格要求,注意耦合&…

【Java数据结构重点知识】第一节:认识数据结构与算法、集合框架

一:数据结构与算法 1.数据结构 数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合 2.算法 算法就是定义良好的计算过程。他取一个或一组的值为输入,并产生一个或一组作为输出。简单来说就是一系列的…

回文链表Java

我们可以采用双指针的办法进行,如下图: 如果链表长度为偶数,则直接从第二个指针的位置开始对链表进行反转;如果是奇数,则从第二指针的下一位进行链表反转 代码实现: public static void main(String[] args) {ListNode next4 new ListNode(1, null);ListNode next3 new Lis…

解决方案|法大大电子合同加速互联网家装服务升级

随着互联网的快速发展以及政策的不断推动,家装行业“互联网”趋势也不断凸显。行业内很多企业已经开始在全链条业务中使用电子合同,基于电子合同合规化、无纸化、线上化、智能化的价值赋能,实现家装从需求沟通、家装设计、选材、装修施工、验…