小弟是新手,求指教!!
begin trans a
 insert (...);
 update(.....);
 delete(.....);
 Exception:****
commit;
就这个例子而言?
1.上面的a事务中没有在****处显式指定rollback,那么如果update出错,这个事务会回滚到上一次正确状态吗(是不是可以不要rollback,出错后也会回滚到上一次正确状态)?2.假设执行到update出错了(没有rollback语句),commit会执行吗?如果执行,是不是只提交insert(正确)部分?还是insert部分也不会提交?还是commit根本不会执行?3.假设我在****处加入了rollback,那么回滚后是继续重新执行事务a直到成功(在事务a中循环),还是回滚到先前正确状态后跳到下一个事务?问题很菜,求高手们指教这三个问题。非诚勿扰!

解决方案 »

  1.   


    --首先你要理解一个事务结束的标准是 显示或隐式 发出 commit 或者 rollback,在发出之后标志另外一个事务的开始。
    --显示的发出就是敲命令的方式 commit 或者 rollback
    --隐式的方式就是比如你 insert 之后,发出了ddl语句(如create、alter等),oracle会隐式commit
    --下面解释你的问题--1.上面的a事务中没有在****处显式指定rollback,那么如果update出错,
    -----这个事务会回滚到上一次正确状态吗(是不是可以不要rollback,出错后也会回滚到上一次正确状态)?--你的事务开始后你分别做了 insert、update、delete 期间你没有做过任何操作,因此这个事务开始了但是没有结束
    --虽然你的update出错了,但是你并没有显示或隐式的结束事务,因此你在update之后rollback,会将整个事务回滚。--2.假设执行到update出错了(没有rollback语句),commit会执行吗?
    --如果执行,是不是只提交insert(正确)部分?还是insert部分也不会提交?还是commit根本不会执行?--如果你是在sqlplus中直批量执行的命令(就是写好后直接粘贴到sqlplus窗口),那么commit 会执行。
    ----执行后标志整个事务的结束,并使得结果永久化,但是因为你的update出错了,因此update并没有起作用。
    --如果你是通过plsql程序执行的,那么update出错后,程序直接异常,下面的commit不会被执行。
    ----在这种情况下,如果你的异常处理里面没有写 commit 或者 rollback的话,事务并未结束,你还需要再
    ----发出commit 或 rollback结束事务。
    --3.假设我在****处加入了rollback,那么回滚后是继续重新执行事务a直到成功(在事务a中循环),还是回滚到先前正确状态后跳到下一个事务?
    --这个已经解释的很明白了,rollback了事务就结束了,一个事务的结束标志着另外一个事务的开始。
    --而事务本身是不会循环的,除非你写了循环逻辑不停的处理这个事务,但是这个事务也不是你认为的重复执行事务a
    ---而是重复的结束旧事务 开始新事务。
      

  2.   

    1、在存储过程或PL/SQL块中,事务开启后,除非主动提交或回滚,oracle不会自动提交或回滚。
    2、如果执行到update出错,则转移到exception处执行,会执行commit,提交insert部分。
    3、如果加入rollback,则回滚当前事务的所有操作,转入下一个事务(如果有的话)。
      

  3.   

    我想问下
    begin trans a
     insert (...);
     update(.....);
     delete(.....);
    commit;
    现在没有Execption标志且没有rollback;
    update出错了,commit会执行吗?(正确执行的insert)会被正确提交吗?
      

  4.   

    我想问下
    begin trans a
     insert (...);
     update(.....);
     delete(.....);
    commit;
    现在没有Execption标志且没有rollback;
    update出错了,commit会执行吗?(正确执行的insert)会被正确提交吗?
      

  5.   


     还是一样的,看你是在什么地方执行的了:
       如果是在sqlplus中批量执行的,commit会走,将以上的数据提交,但因为update出错了,因此update无效。
       如果是在plsql中执行,update出错,程序异常,commit不会走。
      

  6.   

    begin trans a
     insert (...);
     update(.....);
     delete(.....);
    commit;
     Exception
    when others then rollback;
    commit;
    以上3个动作任何一个异常都会回滚到INSERT 以前状态,