在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语句可以进行回滚。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/237293.html