我有一个定期更新其数据库模式的程序。有时,其中一个 DDL 语句可能会失败,如果确实如此,我想回滚所有更改。我将更新包装在这样的事务中:
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 没有预期的效果。Oracle 似乎在每个 DDL 语句之后执行一个隐式 COMMIT:
- 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
有什么办法可以关闭这个隐式提交?