joe*_*ker 103 sql ddl transactions create-table
我正在研究一个发布DDL的程序.我想知道是否CREATE TABLE
可以回滚和类似的DDL
描述每个数据库如何使用DDL处理事务.
joe*_*ker 140
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis从PostgreSQL的角度概述了这个问题.
DDL是否根据此文件进行交易?
SQLite似乎也有事务性DDL.我能够ROLLBACK
一个CREATE TABLE
在SQLite的声明.它的CREATE TABLE
文档没有提到任何特殊的交易'陷阱'.
ara*_*nid 29
PostgreSQL对大多数数据库对象(当然是表,索引等,但不是数据库,用户)具有事务DDL.但实际上任何DDL都会ACCESS EXCLUSIVE
锁定目标对象,使其在DDL事务完成之前完全无法访问.此外,并非所有情况都得到了很好的处理 - 例如,如果您尝试从foo
另一个事务中删除它并创建替换表时从表中进行选择,则被foo
阻止的事务最终将收到错误而不是查找新foo
表.(编辑:这是在PostgreSQL 9.3之前或之前修复的)
CREATE INDEX ... CONCURRENTLY
这是例外,它使用三个事务来为表添加索引,同时允许并发更新,因此它本身不能在事务中执行.
此外,数据库维护命令VACUUM
不能在事务中使用.
似乎无法用MySQL完成,非常愚蠢,但确实如此......(根据接受的答案)
“InnoDB 中的 CREATE TABLE 语句作为单个事务处理。这意味着来自用户的 ROLLBACK 不会撤消用户在该事务期间所做的 CREATE TABLE 语句。”
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
尝试了几种不同的方法,它根本不会回滚..
解决方法是简单地设置一个失败标志,如果其中一个查询失败,则执行“删除表 tblname”。
看起来其他答案已经相当过时了。
截至 2019 年:
归档时间: |
|
查看次数: |
67236 次 |
最近记录: |