ORACLE对DDL等语句进行自动提交,DML语句可以手工提交,或者回滚事务.
但是如果出现这样的情况:
Insert into some_table values(‘Before’);Creaate table T(x int);Insert into some_table values(‘After’);Rollback;在第三条语句Insert出错时,回滚,只会回滚第三条,不会回滚前两条因为DDL语句前后都有默认的COMMIT。怎么解决这样的问题呢,只要一个出错整体回滚。

解决方案 »

  1.   

    你先执行DDL语句,再执行DML语句不就行了。干嘛非要交叉着来。
      

  2.   

    试过 savepoint aa;
    .......
    .......
    .......rollback aa;
      

  3.   

    我是在EJB中处理回滚,如果用SQL语句建立Savepoint ,在EJB中用什么进行回滚啊,直接调用Usertran.rollback 不会回滚到指定地点吧
      

  4.   


    呵 可以使用PL/SQL   然后执行它
      

  5.   

    savepoint a;
    ...
    rollback to a;
      

  6.   

    最好先执行DDL语句,再执行DML语句。如果DML语句出错的话全部回滚就好了。
      

  7.   

    LZ的意思是出错后,就回滚全部INSERT操作吧?
    rollback to savepoint 前执行DDL,就包含提交了这个事务就结束了。怎么可能用savepoint来实现全部回滚?
      

  8.   

    ddl语句在事务前执行(况且正常的系统不应该业务中频繁的进行ddl操作),
    事务中严禁执行ddl,如果执行ddl,就是设计存在缺陷。
      

  9.   

    试过了,创建Savepoint aa后,如果执行DML语句可以使用rollback to aa 返回到保存点,如果之后执行DDl语句比如 alter table a1 add uui number;
    这样之前创建的Savepoint 会失效。无法返回。
    还有别的方法没?
      

  10.   

    我只是举个例子,比如我有两个操作,一个是DDl语句,alter table t1 add ID number(2);
                                 第二个语句是DML语句 insert into t2 values(2,2,2);
    我想把这两个操作做成一个事务,原因是,这两个操作需要一致,也就是说如果其中一个出错,两个语句都必须回滚,否则会造成结果的不一致性,
    就像银行转账一样,转账过程出错,双方必须都回滚到原始状态,否则会出现一致性错误
      

  11.   

    方法在1、7、9楼都给你说过了。
    这是关系型数据库必须满足的ACID测试。
    如果你的执行顺序:DML-DDL-DML,然后还能回滚全部DML,这就不是关系型数据库了。
      

  12.   

    “我想把这两个操作做成一个事务...也就是说如果其中一个出错,两个语句都必须回滚,”?
    一个DDL和一个DML?DDL就没有回滚一说。
      

  13.   

    如果先执行DDl语句,再执行DML语句,
    DML语句出现错误时需要回滚,我想连DDL语句一起回滚可以实现吗?(不回滚会出现一致性问题)
    现在就是需要这样的功能
      

  14.   

    用存储过程
    exception
       when others then
           Rollback; 
           drop T;
      

  15.   

    但是在oracle里DDL根本就没有回滚这一说。
    执行DDL时内部就包含了COMMIT,所以对DDL不存在回滚。
      

  16.   

    没有其他办法能够回滚DDL语句了吗这个业务需求是挺特殊的,但是必须的这么实现。
      

  17.   

    有没有办法,比如修改ORACLE配置等,让DDL不自动提交,使它跟DML语句一样,可以用户提交
      

  18.   

    ddl回滚不了,create的你就只能用drop自己去回了。。
      

  19.   

    oracle中解决不了可以在EJB重新中处理,抛出个异常把数据恢复回去就是了