我正在开发一个发布DDL的程序。我想知道{/ 1}}和类似的DDL是否可以在
中回滚描述每个数据库如何使用DDL处理事务。
答案 0 :(得分:131)
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis从PostgreSQL的角度概述了这个问题。
根据这份文件,DDL是否有交易?
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年: