oracle开发中重复commit的问题

moqijun 2007-10-16 01:42:25
一般程序调用数据库存储过程时,程序代码调用完成后都会显式Commit提交,但在存储过程绑定的代码中,最后一般也会commit 。
这样的话,程序调用一次存储过程,就会产生俩次提交(一次存储过程,一次程序)其实程序的提交是没有必要的,因为
存储过程已经提交了事务。
现在我们的系统中大量存在这种请况,造成数据库事务量太大,有时会出现数据库服务死掉的情况。
请问事务量太大是由于程序重复Commit引起的吗?有没有什么解决办法?(数据是Oracle 10g)
...全文
582 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
precipitant 2007-10-26
  • 打赏
  • 举报
回复
路过,学习!
newjq 2007-10-25
  • 打赏
  • 举报
回复
最大的可能就是代码编写水平导致运行效率低下,或者并发锁死
rorey_008 2007-10-18
  • 打赏
  • 举报
回复
解决方案:
1.提高LGWR性能
尽量使用快速磁盘,不要把redo log file存放在raid 5的磁盘上
2.使用批量提交
3.适当使用NOLOGGING/UNRECOVERABLE等选项
nemo0228 2007-10-18
  • 打赏
  • 举报
回复
重复提交没有影响的,因为commit的时间可以忽略,第二个提交是一个空的提交
moqijun 2007-10-18
  • 打赏
  • 举报
回复
谢谢各位,一般情况下,这种是需要调整程序还是优化数据库比较好?
  • 打赏
  • 举报
回复
当一个用户提交(commits)或者回滚(rollback),session的redo信息需要写出到redo logfile中.
用户进程将通知LGWR执行写出操作,LGWR完成任务以后会通知用户进程.
这个等待事件就是指用户进程等待LGWR的写完成通知.

对于回滚操作,该事件记录从用户发出rollback命令到回滚完成的时间.

如果该等待过多,可能说明LGWR的写出效率低下,或者系统提交过于频繁.
针对该问题,可以关注:
log file parallel write等待事件
user commits,user rollback等统计信息可以用于观察提交或回滚次数

解决方案:
1.提高LGWR性能
尽量使用快速磁盘,不要把redo log file存放在raid 5的磁盘上
2.使用批量提交
3.适当使用NOLOGGING/UNRECOVERABLE等选项

可以通过如下公式计算平均redo写大小:

avg.redo write size = (Redo block written/redo writes)*512 bytes

如果系统产生redo很多,而每次写的较少,一般说明LGWR被过于频繁的激活了.
可能导致过多的redo相关latch的竞争,而且Oracle可能无法有效的使用piggyback的功能.

吐司vivi 2007-10-16
  • 打赏
  • 举报
回复
路过 学习~~
  • 打赏
  • 举报
回复
重复提交没有任何影响的,并且提交的频繁不但不会影响效率,反而会提高效率,因为commit的时间可以忽略的,而commit后会释放相应的资源。

好想不是这样吧???? <Oracle9i&10g编程艺术>说不要频繁提交 提交时机是恰当的事务结束!

我维护的也提交频繁 主要是时间点上 导致日志写频繁!

10g 有个批量提交的参数
issgates 2007-10-16
  • 打赏
  • 举报
回复
帮顶, 学习.
kinglht 2007-10-16
  • 打赏
  • 举报
回复
重复提交没有任何影响的,并且提交的频繁不但不会影响效率,反而会提高效率,因为commit的时间可以忽略的,而commit后会释放相应的资源。
dawugui 2007-10-16
  • 打赏
  • 举报
回复
commit只是将没有提交的数据提交.
如果都提交了再commit,只是个空提交.
重复提交不会影响数据库的速度.
bjt_ 2007-10-16
  • 打赏
  • 举报
回复
应该不是,查查v$session_wait表,看看是什么导致数据库慢

17,078

社区成员

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

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