oracle里讲的事务,实现方式就是通过设置保存点来实现的吗?
还是还有其他标志性的标记?比如打包性的:
(事务开始)
update
delete
select
delete
(事务结束)
一旦回滚就全部取消前面的操作。

解决方案 »

  1.   


    /*
    oracle中事物是一组sql语句的集合,他们组成一个逻辑工作单元;
    事物具有以下特性(ACID特性):
    1,原子性(automicity):事物中的动作要么都发生,要么都不发生
    2,一致性(consistency):事物将数据库从一种一致状态转换为另一种一致状态
    3,隔离性(isolation):一个事物的影响在该事物提交之前对其他事物都不可见
    4,持久性(durability):事物一旦提交,其结果将是永久性的
    commit,savepoint,rollback等只是事物控制语句,他们将在事物的操作过程中
    使事物保持完整性。
    commit用来显示提交事物,提交的事物不可回滚;
    savepoint:设置保存点;
    rollback to savepoint:用来回滚事物,即撤销当前未提交的事物所作的所有修改;
    set transaction:用于设置不同的事物隔离级别;
    这里要注意的是commit,它是用来显示提交事物的,
    但是我们的一些操作会隐式的提交事物;
    这些操作就是我们所说的ddl语句,而一般的dml语句是不能导致事物的提交的;
    */
    SQL> create table t(id number(10));
    Table createdSQL> --craete 是一个ddl语句,它会隐式的提交事物,我们这里的创建表就是一个事物
    SQL> insert into t values(1);
    1 row insertedSQL> insert into t values(154);
    1 row insertedSQL> savepoint a;
    Savepoint createdSQL> --这里设置了一个保存点,用于下面的回滚
    SQL> insert into t values(10101);
    1 row inserted
    SQL> insert into t values(10101000);
    1 row insertedSQL> select * from t;
             ID
    -----------
              1
            154
          10101
       10101000SQL> rollback to a;--我们回滚到保存点a,那么保存点a之后添加的数据就没了
    Rollback completeSQL> select * from t;
             ID
    -----------
              1
            154SQL> insert into t values(10101000);
    1 row inserted
    SQL> insert into t values(111111111);
    1 row insertedSQL> select * from t;
             ID
    -----------
              1
            154
       10101000
      111111111SQL> --如果此时我们执行一条ddl语句,那么将会提交之前的所有操作
    SQL> create table a
      2  as select * from t;Table createdSQL> --此时我们回滚一下操作,看看有什么效果
    SQL> rollback ;--这里不指定保存点,而是全部回滚Rollback completeSQL> select * from t;         ID
    -----------
              1
            154
       10101000
      111111111SQL> --我们看到,我们的rollback就像没有起作用一样
    SQL> --这就证明了ddl操作隐式的提交了之前的所有事物的操作,即使我们没有显示的commit之前的事物
    SQL> rollback to a;rollback to aORA-01086: savepoint 'A' never establishedSQL> --而且提示找不到刚刚才我们建立的保存点a
    SQL> 
      

  2.   


    SQL> drop table t;
    Table droppedSQL> drop table a;
    Table droppedSQL> commit;--这才是现实的提交
    Commit complete