lameig 发表于 2012-05-29 10:50

本帖最后由 lameig 于 2012-05-29 10:56 编辑

回复 2# doni


    楼主的DDL语句在语法上就不能通过,所以执行了DDL后还有事务可回滚!在DDL语法正确的情况下,无论DDL是否执行成功,都会自动提交之前的所有事务,而且再也无法回滚!试试以下语句:
--先保证数据表中有数据行
SQL> INSERT INTO PLANTS VALUES(1, 'African Violet');

已创建 1 行。

SQL> commit;

提交完成。

--再执行DDL对事务的影响

SQL> INSERT INTO PLANTS VALUES(2, 'African');

已创建 1 行。

SQL> alter table PLANTS modify common_name number;
alter table PLANTS modify common_name number
                                 *
ERROR 位于第 1 行:
ORA-01439: 要更改数据类型,则要修改的列必须为空 (empty)


SQL> SELECT * FROM PLANTS;

PLANT_ID COMMON_NAME
---------- ---------------
         1 African Violet
         2 African

SQL> rollback;

回退已完成。

SQL> SELECT * FROM PLANTS;

PLANT_ID COMMON_NAME
---------- ---------------
         1 African Violet
         2 African

虽然提示回滚已完成,但是实际上是因为没有事务可回滚。在DDL前后分别加入SELECT name FROM V$TRANSACTION;就可以看到是否有事务了。
页: 1 [2]
查看完整版本: 【sql请教】DDL语句不能自动回滚