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

joe*_*ker 103 sql ddl transactions create-table

我正在研究一个发布DDL的程序.我想知道是否CREATE TABLE可以回滚和类似的DDL

  • Postgres的
  • MySQL的
  • SQLite的

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

joe*_*ker 140

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

DDL是否根据此文件进行交易?

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

SQLite似乎也有事务性DDL.我能够ROLLBACK一个CREATE TABLE在SQLite的声明.它的CREATE TABLE文档没有提到任何特殊的交易'陷阱'.

  • 但是,sqlite的默认Python驱动程序会阻止事务SQL.http://bugs.python.org/issue10740 (7认同)
  • MariaDB中存在一个未解决的问题,即添加事务DDL支持:https://jira.mariadb.org/browse/MDEV-4259.请投票支持. (3认同)
  • 所以答案是“是的,它们可以回滚,除非您使用的是 MySQL 或旧版本的 Oracle”。 (2认同)

ara*_*nid 29

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

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

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


Rob*_*air 7

似乎无法用MySQL完成,非常愚蠢,但确实如此......(根据接受的答案)

“InnoDB 中的 CREATE TABLE 语句作为单个事务处理。这意味着来自用户的 ROLLBACK 不会撤消用户在该事务期间所做的 CREATE TABLE 语句。”

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

尝试了几种不同的方法,它根本不会回滚..

解决方法是简单地设置一个失败标志,如果其中一个查询失败,则执行“删除表 tblname”。


Pau*_*est 7

看起来其他答案已经相当过时了。

截至 2019 年:

  • Postgres 在许多版本中都支持事务性 DDL。
  • SQLite 在许多版本中都支持事务 DDL。
  • MySQL 从 8.0 (2018 年发布)开始支持Atomic DDL 。

  • 需要注意的是,MySQL 8 中的原子 DDL 仅指原子 DDL 语句,而不是事务性语句。DDL 语句,无论是否原子,大多数情况下仍然会导致隐式提交,因此无法在另一个事务中执行(例如“START TRANSACTION ... COMMIT;”)。因此,如果后一个事务在同一个事务中,您仍然无法回滚事务中的 DDL 语句。事务失败。(请参阅 https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html#atomic-ddl-characteristics 下的注释) (4认同)