是否有可能在主要SQL数据库中回滚CREATE TABLE和ALTER TABLE语句?
我正在开发一个发行DDL的程序。 我想知道是否可以回滚CREATE TABLE
和类似的DDL
- Postgres的
- MySQL的
- SQLite的
- 等人
描述每个数据库如何处理DDL事务。
根据这个文件是DDL交易吗?
- PostgreSQL – 是的
- MySQL – 没有; DDL导致一个隐含的提交
- Oracle数据库11g第2版及更高版本 – 缺省情况下,不存在,但存在称为基于版本的重定义的替代方法
- 旧版本的Oracle – 不行; DDL导致一个隐含的提交
- SQL Server – 是的
- Sybase Adaptive Server – 是的
- DB2 – 是的
- Informix – 是的
- 火鸟(Interbase) – 是的
SQLite也似乎有事务性的DDL。 我能够在SQLite中ROLLBACK
CREATE TABLE
语句。 它的CREATE TABLE
文档没有提到任何特殊的事务性“陷阱”。
PostgreSQL对大多数数据库对象(当然是表,索引等,但不是数据库,用户)有事务性的DDL。 然而实际上任何DDL都会在目标对象上获得一个ACCESS EXCLUSIVE
锁,使得它完全无法访问,直到DDL事务完成。 另外,不是所有的情况都是相当的处理,例如,如果您尝试从表foo
select另一个事务正在删除它并创buildreplace表foo
,则被阻止的事务将最终收到错误,而不是find新的foo
表。 (编辑:这是在PostgreSQL 9.3之前或之前修复的)
CREATE INDEX ... CONCURRENTLY
是个例外,它使用三个事务向一个表添加一个索引,同时允许并发更新,所以它本身不能在事务中执行。
此外,数据库维护命令VACUUM
不能在事务中使用。
尽pipe并不是严格意义上的“回滚”,但在Oracle中,如果数据库已configuration为支持,则可使用FLASHBACK命令撤消这些types的更改。
用MySQL似乎无法做到,很愚蠢..
“InnoDB中的CREATE TABLE语句作为单个事务来处理,这意味着来自用户的ROLLBACK不会撤销用户在该事务中创build的CREATE TABLE语句。
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
尝试了几种不同的方式,它不会回滚..
解决方法是简单地设置一个失败标志,如果其中一个查询失败,则执行“drop table tblname”。