4
我有一个定期更新其数据库架构的程序。有时候,其中一个DDL语句可能会失败,如果是这样,我想要回滚所有更改。我换了更新的事务,像这样:在事务中包装Oracle架构更新
BEGIN TRAN;
CREATE TABLE A (PKey int NOT NULL IDENTITY, NewFieldKey int NULL, CONSTRAINT PK_A PRIMARY KEY (PKey));
CREATE INDEX A_2 ON A (NewFieldKey);
CREATE TABLE B (PKey int NOT NULL IDENTITY, CONSTRAINT PK_B PRIMARY KEY (PKey));
ALTER TABLE A ADD CONSTRAINT FK_B_A FOREIGN KEY (NewFieldKey) REFERENCES B (PKey);
COMMIT TRAN;
由于我们执行时,如果语句的一个失败,我做了ROLLBACK而不是COMMIT。这在SQL Server上效果很好,但对Oracle没有预期的效果。甲骨文似乎做每个DDL语句后隐式提交:
- http://www.orafaq.com/wiki/SQL_FAQ#What_are_the_difference_between_DDL.2C_DML_and_DCL_commands.3F
- http://infolab.stanford.edu/~ullman/fcdb/oracle/or-nonstandard.html#transactions
有关闭这个隐式提交的方式?
Oracle在每个DDL语句之前以及之后发出一个COMMIT。 – APC 2009-09-12 16:42:00