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 | | 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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2991703/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在Oracle中,如何定時清理INACTIVE狀態的會話?Oracle會話
- 檢視當前pg會話連線數會話
- Spring Data JPA中事務回滾意外RollbackExceptionSpringException
- 【iOS】當我們在application:DidFinishLaunchWithOptions:中返回NO時會發生什麼iOSAPP
- 在檢視中使用會話會話
- 當你在瀏覽器中輸入URL回車後會發生什麼?瀏覽器
- MySQL必知必會:簡介undo log、truncate、以及undo log如何幫你回滾事物MySql
- GreatSQL 在SQL中使用 HINT 語法修改會話變數SQL會話變數
- spring事務裡面開啟執行緒插入,報錯了是否會回滾?Spring執行緒
- 關於事務回滾註解@Transactional
- sqlserver遇到回滾事務的操作策略SQLServer
- 在當前的形式下,以展會的營銷模式已不再受用模式
- 不能回滾的Redis事務還能用嗎Redis
- MySQL實現事務的提交和回滾MySql
- 在改變中緩步前行的暴雪
- 當AI遇上展會——全息世界的又一“現在進行時”AI
- iPhone通話中不能錄音,卻能充當"竊聽器",你不會現在才知道吧iPhone
- T-SQL——關於事務回滾的方式SQL
- 客戶端登陸logout操作,事務回滾客戶端Go
- MySql事務無法回滾的原因有哪些MySql
- Spring事務不能回滾的深層次原因Spring
- 在MySQL中 Truncate Delect Drop 的區別MySql
- 時間可以改變一切
- 當你在 Linux 上啟動一個程式時會發生什麼?Linux
- 在Kubernetes中建立Pod時會發生什麼? - daniele
- ?ORACLE會話超時Oracle會話
- Hadoop會在2022年過時嗎?Hadoop
- 【JS】在連續性監聽事件中,監聽當前狀態是否變化JS事件
- 【java】校驗當前時間是否在規定的時間內Java
- spark sql在當前的時間戳下增加8個小時SparkSQL時間戳
- 停止鍛鍊人體會在多長時間變得不健康?
- 關於ORACLE大型事務回滾的幾個點Oracle
- openGauss 子事務併發回滾流程最佳化
- Oracle查詢回滾大事務所需時間Oracle
- 處理異常時,在catch中return會怎麼樣?
- SIE北美總裁:VR將會在未來十年發生許多改變VR
- 在VUE中改變陣列、物件。頁面沒有變化Vue陣列物件
- spring事務增強,事務回滾如何判斷?希望在前端上有個提示Spring前端