PostgreSQL支持Transactional DDL吗

什么是Transactional DDL?

Transactional(事务)在关系型数据库是指一组SQL语句,要么提交,要么全部回滚。事务中包含的语句通常是DML语句,如INSERT、UPDATE、DELETE等。但是对于DDL语句呢?是否可以在事务中包含诸如CREATE、ALTER、DROP等DDL命令?

所谓Transactional DDL就是我们可以把ddl放到事务中,做到事务中的ddl语句要么全部提交,要么全部回滚

PG是否支持Transactional DDL?

看个pg的例子

postgres=# begin;
BEGIN
postgres=*# create table a_test(id int);
CREATE TABLE
postgres=*# insert into a_test values(1);
INSERT 0 1
postgres=*# rollback;
ROLLBACK
postgres=# select * from a_test;
ERROR:  relation "a_test" does not exist
LINE 1: select * from a_test;
                      ^
postgres=#

可见,在postgresql中,是支持transactional ddl的,在上例中,create table语句被回滚掉了。

并不是所有数据库都支持Transactional ddl,比如mysql。

看个mysql的例子:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql>  create table a_test (id int);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into a_test values(1);
Query OK, 1 row affected (0.01 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from a_test;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

可以看到mysql这个例子里,不仅create语句没有回滚掉,insert语句也没有回滚掉。这是因为:在mysql中,当执行ddl语句时,会隐式地将当前会话的事务进行一次commit操作。 所以我们应该严格地将DDL和DML完全分开,不能混合在一起执行。

一些特例

需要注意的是在pg中并不是所有的ddl都支持Transactional ddl。比如CREATE INDEX CONCURRENTLY、CREATE DATABAE 、CREATE TABLESPACE等等。

postgres=# begin
postgres-# ;
BEGIN
postgres=*# CREATE INDEX CONCURRENTLY idx_id ON a_test (id);
ERROR:  CREATE INDEX CONCURRENTLY cannot run inside a transaction block

Transactional DDL的好处

在进行一些模式升级等复杂工作时,可以利用此功能保护数据库。我们可以将所有更改都放入事务块中,确保它们都以原子方式应用,或者根本不应用。这大大降低了数据库因模式更改中的输入错误或其他此类错误而损坏数据库的可能性。

总结

transactional ddl是指可以把ddl放到事务中,做到事务中的ddl语句要么全部提交,要么全部回滚。

PG大部分ddl都支持Transactional ddl,除了一些CREATE INDEX CONCURRENTLY、CREATE DATABAE 、CREATE TABLESPACE等语句。



参考:

https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis

https://www.cybertec-postgresql.com/en/transactional-ddls/

PostgreSQL支持Transactional DDL吗


点个“赞 or 在看” 你最好看!


喜欢,就关注我吧!





👇👇👇谢谢各位老板啦!!!

原文始发于微信公众号(PostgreSQL运维技术):PostgreSQL支持Transactional DDL吗

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/45647.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!