我现在有个需求:
我的存储过程大概有6000行代码,里面有insert操作一个批次不超过5000条吧,
执行到最后如果成功则commit,否则rollback。不知道这样会不会有问题,请大家尽情发言。oracle

解决方案 »

  1.   

    我的意思是一个代码量超过5000行,插入操作大概5000左右的存储过程用一个commit应该没问题吧?
      

  2.   

    commit跟你代码多少行没啥关系,你只要控制好逻辑机构就行;
      

  3.   

    我就想让一个比较大的业务事务只有一个提交和commit,这样就不用去做无意义的删除回滚了。
      

  4.   

    谈到这个问题,就要说说commit时数据库做了哪些事(以下为查阅所得)。
          其实commit执行前,在数据库中已经执行了数据更改,所以已经完成了99%的任务,例如:下列操作已经产生:       
          1.在SGA(Buffer Cache)中已经生成了undo块;
          2.在SGA(Buffer Cache)中已经生成了产生改变的数据块和索引块;
          3.在REDO LOG BUFFER生成了前面两项的redo信息;
         4.依赖于前三项产生的数据量大小以及操作需要的时间,buffer中的数据可能已经
             有一部分输出到了磁盘;
          5.所有需要的锁已经获得;
          当执行COMMIT命令时,只执行如下操作:
          1.为事务生成SCN:SCN是ORACLE数据库的一种计时信息,用以保证事务的顺序性,
             同时还用于失败恢复和保证数据库的读一致性和检查点,无论何时何人提交,SCN
             自动加1;      
          2.将事务相关的未写入redo log file中的redo信息从redo log buffer写入到redo log
            file,这才是真实的COMMIT,这步操作完成,说明我们已经完成COMMIT,事务从
            V$TRANSACTION中移除;
          3.V$LOCK中记录的SESSION关于该事务的锁会释放,其他需要这些锁的事务被唤醒;
          4.执行块清理,清理块头保存的事务信息;
          第2点看出大数据量commit时涉及到对服务器io的考验。
          但5000条理论上是肯定没问题的。