PG中的DDL支持回滚
在Oracle或MySQL中,当执行到DDL语句时,会隐式的将当前回话的事务进行一次“COMMIT”操作,因此在MySQL或Oracle中执行DDL语句时,应该严格地将DDL和DML完全分开,不能混合在一起执行。
在PG中,DDL语句是可以被回滚的。
Oracle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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语句可以进行回滚。
人大金仓的数据库和PG一样,都可以进行DDL回滚!