我正在开发一个发布ddl的程序。我想知道 CREATE TABLE 类似的ddl可以在博士后mysql数据库橄榄石等描述每个数据库如何使用ddl处理事务。
CREATE TABLE
0md85ypi1#
虽然严格来说不是“回滚”,但在oracle中,如果数据库配置为支持flashback命令,则可以使用flashback命令撤消这些类型的更改。
xmjla07d2#
看来其他答案都过时了。截至2019年:postgres在许多版本中都支持事务ddl。sqlite在许多版本中都支持事务性ddl。mysql从8.0(于2018年发布)开始就支持原子ddl。
nbewdwxp3#
用mysql是做不到的,看起来,很蠢,但是真的(根据接受的答案)“innodb中的create table语句作为单个事务处理。这意味着用户的回滚不会撤消用户在该事务期间所做的create table语句。”https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html尝试了一些不同的方法,但它根本不会回滚。。解决方法是简单地设置一个失败标志,并在其中一个查询失败时执行“drop table tblname”。。
zsohkypk4#
postgresql为大多数数据库对象(当然是表、索引等,但不是数据库、用户)提供了事务性ddl。然而实际上任何ddl都会得到一个 ACCESS EXCLUSIVE 锁定目标对象,使其在ddl事务完成之前完全不可访问。另外,并不是所有的情况都能很好地处理—例如,如果您尝试从表中选择 foo 而另一个事务正在删除它并创建替换表 foo ,则被阻止的事务最终将收到错误,而不是找到新的 foo table(编辑:在postgresql 9.3中或之前修复了此问题 CREATE INDEX ... CONCURRENTLY 例外情况是,它使用三个事务将索引添加到表中,同时允许并发更新,因此它本身不能在事务中执行。还有数据库维护命令 VACUUM 不能在事务中使用。
ACCESS EXCLUSIVE
foo
CREATE INDEX ... CONCURRENTLY
VACUUM
llycmphe5#
http://wiki.postgresql.org/wiki/transactional_ddl_in_postgresql:竞争分析从postgresql的Angular 概述了这个问题。根据本文档,ddl是事务性的吗?postgresql-是mysql—否;ddl导致隐式提交oracle database 11g release 2及更高版本-默认情况下,没有,但存在一种称为基于版本的重新定义的替代方法旧版本的甲骨文-没有;ddl导致隐式提交sql server-是sybase自适应服务器-是db2-是informix-是firebird(interbase)-是sqlite似乎也有事务ddl。我能做到 ROLLBACK 一 CREATE TABLE sqlite中的语句。它 CREATE TABLE 文档没有提到任何特殊的事务性“gotchas”。
ROLLBACK
5条答案
按热度按时间0md85ypi1#
虽然严格来说不是“回滚”,但在oracle中,如果数据库配置为支持flashback命令,则可以使用flashback命令撤消这些类型的更改。
xmjla07d2#
看来其他答案都过时了。
截至2019年:
postgres在许多版本中都支持事务ddl。
sqlite在许多版本中都支持事务性ddl。
mysql从8.0(于2018年发布)开始就支持原子ddl。
nbewdwxp3#
用mysql是做不到的,看起来,很蠢,但是真的(根据接受的答案)
“innodb中的create table语句作为单个事务处理。这意味着用户的回滚不会撤消用户在该事务期间所做的create table语句。”
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
尝试了一些不同的方法,但它根本不会回滚。。
解决方法是简单地设置一个失败标志,并在其中一个查询失败时执行“drop table tblname”。。
zsohkypk4#
postgresql为大多数数据库对象(当然是表、索引等,但不是数据库、用户)提供了事务性ddl。然而实际上任何ddl都会得到一个
ACCESS EXCLUSIVE
锁定目标对象,使其在ddl事务完成之前完全不可访问。另外,并不是所有的情况都能很好地处理—例如,如果您尝试从表中选择foo
而另一个事务正在删除它并创建替换表foo
,则被阻止的事务最终将收到错误,而不是找到新的foo
table(编辑:在postgresql 9.3中或之前修复了此问题CREATE INDEX ... CONCURRENTLY
例外情况是,它使用三个事务将索引添加到表中,同时允许并发更新,因此它本身不能在事务中执行。还有数据库维护命令
VACUUM
不能在事务中使用。llycmphe5#
http://wiki.postgresql.org/wiki/transactional_ddl_in_postgresql:竞争分析从postgresql的Angular 概述了这个问题。
根据本文档,ddl是事务性的吗?
postgresql-是
mysql—否;ddl导致隐式提交
oracle database 11g release 2及更高版本-默认情况下,没有,但存在一种称为基于版本的重新定义的替代方法
旧版本的甲骨文-没有;ddl导致隐式提交
sql server-是
sybase自适应服务器-是
db2-是
informix-是
firebird(interbase)-是
sqlite似乎也有事务ddl。我能做到
ROLLBACK
一CREATE TABLE
sqlite中的语句。它CREATE TABLE
文档没有提到任何特殊的事务性“gotchas”。