是否可以在主要SQL数据库中回滚CREATE TABLE和ALTER TABLE语句?

时间:2011-01-14 15:31:16

标签: sql transactions ddl create-table

我正在开发一个发布DDL的程序。我想知道{/ 1}}和类似的DDL是否可以在

中回滚
  • Postgres
  • MySQL
  • SQLite

描述每个数据库如何使用DDL处理事务。

5 个答案:

答案 0 :(得分:131)

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis从PostgreSQL的角度概述了这个问题。

根据这份文件,DDL是否有交易?

  • PostgreSQL - 是的
  • MySQL - 没有; DDL导致隐式提交
  • Oracle数据库11g第2版及更高版本 - 默认情况下,否,但存在一种称为基于版本的重新定义的替代方案
  • 旧版本的Oracle - 没有; DDL导致隐式提交
  • SQL Server - 是
  • Sybase Adaptive Server - 是
  • DB2 - 是
  • Informix - 是
  • Firebird(Interbase) - 是

SQLite似乎也有事务性DDL。我能够在SQLite中ROLLBACK CREATE TABLE语句。它的CREATE TABLE文档没有提到任何特殊的交易'陷阱'。

答案 1 :(得分:26)

对于大多数数据库对象(当然是表,索引等但不是数据库,用户),PostgreSQL具有事务DDL。但实际上任何DDL都会在目标对象上获得ACCESS EXCLUSIVE锁定,使其在DDL事务完成之前完全无法访问。此外,并非所有情况都得到了很好的处理 - 例如,如果您尝试从表foo中选择而另一个事务正在删除它并创建替换表foo,那么被阻止的事务将最终收到错误而不是找到新的foo表。 (编辑:这是在PostgreSQL 9.3之前或之前修复的)

CREATE INDEX ... CONCURRENTLY是例外,它使用三个事务来为表添加索引,同时允许并发更新,因此它本身不能在事务中执行。

此外,数据库维护命令VACUUM不能在事务中使用。

答案 2 :(得分:3)

虽然严格来说并不是“回滚”,但在Oracle中,如果数据库已配置为支持,则FLASHBACK命令可用于撤消这些类型的更改。

答案 3 :(得分:2)

不能用 MySQL 完成它看起来非常愚蠢,但是真的......(按照接受的答案)

  

" InnoDB中的CREATE TABLE语句作为单个语句处理   交易。这意味着来自用户的ROLLBACK不会撤消   用户在该事务期间创建的CREATE TABLE语句。"

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

尝试了几种不同的方式,它只是不会回滚..

解决方法是简单地设置失败标志并执行" drop table tblname"如果其中一个查询失败..

答案 4 :(得分:0)

其他答案似乎已经过时了。

截至2019年:

  • Postgres已支持许多版本的事务性DDL。
  • SQLite已支持许多版本的事务性DDL。
  • MySQL支持Atomic DDL since 8.0(于2018年发布)。