例如oracle 10g
savepoint sp;
op;
savepoint sp2;
op;
savepoint sp3;
op;
rollback;
请问是回到哪个保存点状态?
达人赐教!

解决方案 »

  1.   

    rollback回滚前面所有未commit的DML。也就是说,如果你savepoint sp前还有未提交的DML,它们也一并被回滚,如果你savepoint sp前刚刚commit过,那么,回滚到sp保存点。
      

  2.   

    是不是
    savepoint sp;
    op;
    savepoint sp2;
    op;
    savepoint sp3;
    op;
    commit;--新添
    rollback;
    是否恢复到sp3的状态?
      

  3.   

    SQL> truncate table t_test_transaction;
     
    Table truncated
     
    SQL> 
    SQL> begin
      2  savepoint p1;
      3  insert into t_test_transaction values(1);
      4  savepoint p2;
      5  insert into t_test_transaction values(2);
      6  savepoint p3;
      7  insert into t_test_transaction values(3);
      8  rollback ;
      9  commit;
     10  end;
     11  /
     
    PL/SQL procedure successfully completed
     
    SQL> select * from t_test_transaction;
     
            ID
    ----------
     
    SQL> 
    SQL> begin
      2  savepoint p1;
      3  insert into t_test_transaction values(1);
      4  savepoint p2;
      5  insert into t_test_transaction values(2);
      6  savepoint p3;
      7  insert into t_test_transaction values(3);
      8  rollback to p2;
      9  commit;
     10  end;
     11  /
     
    PL/SQL procedure successfully completed
     
    SQL> select * from t_test_transaction;
     
            ID
    ----------
             1
     
    SQL> 
      

  4.   

    不是,savepoint sp;
    op;
    savepoint sp2;
    op;
    savepoint sp3;
    op;
    commit;--新添
    savepoint sp4;
    op;
    rollback;
    回滚到sp4。
    已经commit的sp,无法回滚了。
      

  5.   

    savepoint只在一个事物里有意义.commit了的话就是上一个事物结束,又将开始一个新事物.
      

  6.   

    SQL> begin
      2  savepoint p1;
      3  insert into t_test_transaction values(1);
      4  savepoint p2;
      5  insert into t_test_transaction values(2);
      6  commit;
      7  savepoint p3;
      8  insert into t_test_transaction values(3);
      9  rollback to p2;
     10  commit;
     11  end;
     12  /
     
    begin
    savepoint p1;
    insert into t_test_transaction values(1);
    savepoint p2;
    insert into t_test_transaction values(2);
    commit;
    savepoint p3;
    insert into t_test_transaction values(3);
    rollback to p2;
    commit;
    end;
     
    ORA-01086: 从未创建保存点 'P2'
    ORA-06512: 在 line 10
     
    SQL>