事务—是否可以回滚主要sql数据库中的create table和alter table语句?

mpbci0fu  于 2021-07-08  发布在  Java
关注(0)|答案(5)|浏览(448)

我正在开发一个发布ddl的程序。我想知道 CREATE TABLE 类似的ddl可以在
博士后
mysql数据库
橄榄石

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

0md85ypi

0md85ypi1#

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

xmjla07d

xmjla07d2#

看来其他答案都过时了。
截至2019年:
postgres在许多版本中都支持事务ddl。
sqlite在许多版本中都支持事务性ddl。
mysql从8.0(于2018年发布)开始就支持原子ddl。

nbewdwxp

nbewdwxp3#

用mysql是做不到的,看起来,很蠢,但是真的(根据接受的答案)
“innodb中的create table语句作为单个事务处理。这意味着用户的回滚不会撤消用户在该事务期间所做的create table语句。”
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
尝试了一些不同的方法,但它根本不会回滚。。
解决方法是简单地设置一个失败标志,并在其中一个查询失败时执行“drop table tblname”。。

zsohkypk

zsohkypk4#

postgresql为大多数数据库对象(当然是表、索引等,但不是数据库、用户)提供了事务性ddl。然而实际上任何ddl都会得到一个 ACCESS EXCLUSIVE 锁定目标对象,使其在ddl事务完成之前完全不可访问。另外,并不是所有的情况都能很好地处理—例如,如果您尝试从表中选择 foo 而另一个事务正在删除它并创建替换表 foo ,则被阻止的事务最终将收到错误,而不是找到新的 foo table(编辑:在postgresql 9.3中或之前修复了此问题 CREATE INDEX ... CONCURRENTLY 例外情况是,它使用三个事务将索引添加到表中,同时允许并发更新,因此它本身不能在事务中执行。
还有数据库维护命令 VACUUM 不能在事务中使用。

llycmphe

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。我能做到 ROLLBACKCREATE TABLE sqlite中的语句。它 CREATE TABLE 文档没有提到任何特殊的事务性“gotchas”。

相关问题