有以下逻辑的存储过程 create or replace procedure pro1()begin    --库存计算
   if *** then
      --库存计算,库存单价计算(进区)
      PRO_TJ_JUDENUMBER_ForNew(strGateJobNo, CustomCode_);//该存储过程中未commit;
    else
      PRO_TJ_JUDENUMBER(strGateJobNo, CustomCode_);//该存储过程中未commit;
    end if;
    //存储过程PRO_TJ_JUDENUMBER_ForNew和PRO_TJ_JUDENUMBER操作同一张表    
    TotalResult := Get_TotalUSA(strGateJobNo);
    if Iresult = '0' or TotalResult = '0' then
      rollback;
    else
      commit;
    end if;Exception
  When Others Then
  begin
    rollback;
  end;
end pro1;请问各位大侠,这一的处理逻辑,会出现数据不一致,脏读等问题吗?
请各位数据库高手指教...

解决方案 »

  1.   

    楼主发了两个贴子,哈哈。
    应该不会出现数据不一致的状况。
    因为:是在最后判断成功后,一起做的Commit, 而中间任何步骤如果出问题的话,都会Rollback。
      

  2.   

    不会出现,放心好了。
    因为你的存储过程执行的时候是在一个session里面,你的任何操作下面的处理逻辑都会看到。并发执行也不会,因为你没有commit,oracle是不会出现别人调用读脏的,不过倒是有可能出现资源争用的情况。比如:两个人同时运行存储过程,同时修改同一条数据的情况。
      

  3.   

    如果你程序里面只有单纯的if判断,不会的。但是如果里面有for循环就肯定会出现的。