PG中的DDL支持回滚

1    689    7

Tags:

👉 本文共约838个字,系统预计阅读时间或需4分钟。

简介

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

在PG中,多数DDL语句是可以被回滚的,但是有一些DDL语句例如CREATE INDEX CONCURRENTLY、CREATE DATABAE 、CREATE TABLESPACE等则不能回滚。

什么是Transactional DDL?

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

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

Transactional DDL的好处

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

Oracle

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

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

MySQL

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

PostgreSQL

可以看到,在PG中,DDL语句可以进行回滚(示例测试了create table和truncate table),而create database不能在事务块中执行。

可以看到,在PG中,创建序列语句create sequence可以回滚,但是序列的值更新后,不会被回滚,所以nextvalsetval调用绝不会回滚!!

总结

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

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

3、在begin中,如果是创建序列,那么会回滚掉;如果是nextval和setval,则不会回滚

4、Oracle和MySQL不支持DDL回滚。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

1 条回复

  1. 头像 小麦苗说道:

    人大金仓的数据库和PG一样,都可以进行DDL回滚!

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部