【问题标题】:A simple scenario in which the effect of the ROLLBACK command can not be observed in Oracle 9i在 Oracle 9i 中观察不到 ROLLBACK 命令效果的简单场景
【发布时间】:2011-11-02 22:52:05
【问题描述】:

假设,在 Oracle 9i 的 SQL 提示符下,我正在使用以下 CREATE SQL 命令创建一个简单的表,例如 orderStatus,其中只有两列。

CREATE TABLE orderStatus(statusID varchar2(6) primary key, status varchar2(15));

然后我正在使用以下 INSERT INTO 命令输入四行。

INSERT INTO orderStatus VALUES("S0001", "Fulfilled");

INSERT INTO orderStatus VALUES("S0002", "Back order");

INSERT INTO orderStatus VALUES("S0003", "In process");

INSERT INTO orderStatus VALUES("S0004", "Cancelled");

成功执行上述命令后,我将发出 COMMIT 命令以完成当前事务。

COMMIT;

然后我需要触发以下 DELETE 命令。

DELETE FROM orderStatus WHERE statusID="S0004";

删除 一个 状态 ID 为 S0004 的行。该表现在只包含 3 行。


假设,我需要将 NOT NULL 约束添加到需要以下 ALTER TABLE 命令的状态列。

ALTER TABLE orderStatus MODIFY(status varchar(15) NOT NULL);

将更改表 orderStatus 以向状态列添加 NOT NULL 约束。


现在,假设我在 SQL 提示符下执行 ROLLBACK 命令,这会导致当前事务完成,并且此表中先前受影响的所有数据都被撤消。这样,之前使用 DELETE 命令删除的行应该被撤消,表现在应该包含原来的四行,但是 ROLLBACK 的效果无法观察到,表将只有三行。为什么会这样?

【问题讨论】:

    标签: oracle oracle9i


    【解决方案1】:

    DDL(例如CREATE TABLE 和ALTER TABLE)在语句执行之前和语句完成之后发出隐式提交。在您的 DDL 导致的隐式提交后,您无法回滚 DDL,也无法回滚 DML 更改(例如您的 DELETE)。

    这就是为什么您通常不想混合 DDL 和 DML。

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多