关于oracle中的commit

编程小强 2013-03-06 07:13:53
我现在有个需求:
我的存储过程大概有6000行代码,里面有insert操作一个批次不超过5000条吧,
执行到最后如果成功则commit,否则rollback。

不知道这样会不会有问题,请大家尽情发言。
...全文
447 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxinde317 2013-03-08
  • 打赏
  • 举报
回复
谈到这个问题,就要说说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条理论上是肯定没问题的。
编程小强 2013-03-08
  • 打赏
  • 举报
回复
我就想让一个比较大的业务事务只有一个提交和commit,这样就不用去做无意义的删除回滚了。
Cryking 2013-03-07
  • 打赏
  • 举报
回复
保证你的业务完整性就可以了,也就是当失败一部分的时候,不会影响你的业务完整性
linwaterbin 2013-03-07
  • 打赏
  • 举报
回复
引用 3 楼 l2tp1012 的回复:
我的意思是一个代码量超过5000行,插入操作大概5000左右的存储过程用一个commit应该没问题吧?
没问题
crazyleeyang 2013-03-07
  • 打赏
  • 举报
回复
commit跟你代码多少行没啥关系,你只要控制好逻辑机构就行;
编程小强 2013-03-07
  • 打赏
  • 举报
回复
我的意思是一个代码量超过5000行,插入操作大概5000左右的存储过程用一个commit应该没问题吧?
pei_zhenxi 2013-03-06
  • 打赏
  • 举报
回复
5000条没啥问题吧
ruihuahan 2013-03-06
  • 打赏
  • 举报
回复
5000 条的话,一次提交应该问题不大,但和服务器性能、当时的负载有关,可测试一下。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧