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