PostgreSQL中的DDL支持回滚

Posted PostgreSQLChina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL中的DDL支持回滚相关的知识,希望对你有一定的参考价值。

作者:小麦苗

在Oracle或mysql中,当执行到DDL语句时,会隐式的将当前回话的事务进行一次“COMMIT”操作,因此在MySQL或Oracle中执行DDL语句时,应该严格地将DDL和DML完全分开,不能混合在一起执行。

在PG中,DDL语句是可以被回滚的。

Oracle

SYS@LHR11G> SET TRANSACTION NAME 't1';
Transaction set.
SYS@LHR11G> create table aa(id int);
Table created.
SYS@LHR11G> select * from aa;
no rows selected
SYS@LHR11G> insert into aa values(1);
1 row created.
SYS@LHR11G> select * from aa;
        ID
----------
         1
SYS@LHR11G> rollback;
Rollback complete.
SYS@LHR11G> select * from aa;
no rows selected

在Oracle的一个事务中,DDL语句不会被回滚。

MySQL

MySQL [lhrdb]> begin;
Query OK, 0 rows affected (0.05 sec)
MySQL [lhrdb]>
MySQL [lhrdb]> create table bb(id int);
Query OK, 0 rows affected (0.11 sec)
MySQL [lhrdb]> rollback;
Query OK, 0 rows affected (0.06 sec)
MySQL [lhrdb]> select * from bb;
Empty set (0.08 sec)
MySQL [lhrdb]> begin;
Query OK, 0 rows affected (0.05 sec)
MySQL [lhrdb]>
MySQL [lhrdb]>
MySQL [lhrdb]> create table cc(id int);
Query OK, 0 rows affected (0.64 sec)
MySQL [lhrdb]> insert into cc values(1);
Query OK, 1 row affected (0.05 sec)
MySQL [lhrdb]> select * from cc;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.05 sec)
MySQL [lhrdb]> rollback;
Query OK, 0 rows affected (0.05 sec)
MySQL [lhrdb]> select * from cc;
Empty set (0.05 sec)

在MySQL的一个事务中,DDL语句不会被回滚。

PostgreSQL

postgres=# begin;
BEGIN
postgres=*# create table aa(id int);
CREATE TABLE
postgres=*# select * from aa;
 id
----
(0 rows)
postgres=*# rollback;
ROLLBACK
postgres=# select * from aa;
ERROR:  relation 'aa' does not exist
LINE 1: select * from aa;
                      ^
postgres=# begin;
BEGIN
postgres=*# create table bb(id int);
CREATE TABLE
postgres=*# insert into bb values(1);
INSERT 0 1
postgres=*# commit;
COMMIT
postgres=# select * from bb;
 id
----
  1
(1 row)
postgres=# begin;
BEGIN
postgres=*# truncate table bb;
TRUNCATE TABLE
postgres=*# rollback;
ROLLBACK
postgres=# select * from bb;
 id
----
  1
(1 row)

可以看到,在PG中,DDL语句可以进行回滚。

以上是关于PostgreSQL中的DDL支持回滚的主要内容,如果未能解决你的问题,请参考以下文章

PG 事务提交与回滚

PostgreSQL 是不是支持表(片段)的透明压缩?

浅析postgresql数据库事务及行锁特征

MySQL 8.0新特性

MySQL 8.0新特性

Oracle 和 PostgreSQL 中的 Write Skew 异常不回滚事务