求教:oracle存储过程执行不稳定

wypudong 2010-04-21 03:15:06
有一个oracle的存储过程,其中逻辑以及涉及的执行语句比较多,执行时间比较长,并在其中调用了其他的存储过程。
本身存储过程中没有进行回滚和提交操作。
在java调用这个存储过程时,通过返回值来判断存储过程是否执行成功,进行相应的回滚或是提交。

java的事务是一个串行的操作,在这个过程的前后,还有其他过程的操作。
现在发现在执行成功的情况下,整个事务进行提交时,这个存储过程中涉及的部分sql语句和存储过程,没有执行。
而且这个部分执行的情况不是每次都出现。
在pl/sql中执行这个存储过程,再提交时,所有涉及的sql语句,调用的存储过程都执行了。


是什么原因?
...全文
353 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wypudong 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 codearts 的回复:]
引用 5 楼 wypudong 的回复:

看了下Oracle事务的说明,没有一个说明说同一个存储过程中执行的DML语句会拆分成2个事务。
无解。。。。。。
有谁对Oracle的事务比较清楚地,帮忙解释一下我的问题。
还是说存储过程中调用另一个存储过程会另起一个事务?



检查代码吧,你说的这个CASE,还没听说过是ORACLE的BUG的。
[/Quote]
在使用相同的参数的时候,直接在pl/sql里面test,然后commit的时候,没有问题。
wypudong 2010-04-23
  • 打赏
  • 举报
回复
本来就在java中有判断,一串的事务,调用proc或者执行sql语句时候都根据返回来判断是否要递交,只要有一个不成功,就都回滚,现在回滚没有问题,commit的时候出的问题。
pastbee 2010-04-21
  • 打赏
  • 举报
回复
全部事物 和 回滚都放到oracle里面做,不要放到JAVA里面
codearts 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wypudong 的回复:]

看了下Oracle事务的说明,没有一个说明说同一个存储过程中执行的DML语句会拆分成2个事务。
无解。。。。。。
有谁对Oracle的事务比较清楚地,帮忙解释一下我的问题。
还是说存储过程中调用另一个存储过程会另起一个事务?
[/Quote]


检查代码吧,你说的这个CASE,还没听说过是ORACLE的BUG的。
vber1010 2010-04-21
  • 打赏
  • 举报
回复
既然是在java中控制,可以在添加一个标志,只有当第一个事务成功提交后更改标志,判断标志是否执行下一个事务。就不会出现问题了。
wypudong 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vber1010 的回复:]
引用 5 楼 wypudong 的回复:
看了下Oracle事务的说明,没有一个说明说同一个存储过程中执行的DML语句会拆分成2个事务。
无解。。。。。。
有谁对Oracle的事务比较清楚地,帮忙解释一下我的问题。
还是说存储过程中调用另一个存储过程会另起一个事务?

调用的过程是自治事务的话,自治事务的提交不会引起外部调用过程的提交。。。
[/Quote]
其中调用的过程不是自治事务,整个事务是在java中进行控制的。
而且现在的状况是被调用的过程没有提交。而外部的过程被提交了。
偶尔的情况也有外部过程中的其他DML语句没有被提交。
vber1010 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wypudong 的回复:]
看了下Oracle事务的说明,没有一个说明说同一个存储过程中执行的DML语句会拆分成2个事务。
无解。。。。。。
有谁对Oracle的事务比较清楚地,帮忙解释一下我的问题。
还是说存储过程中调用另一个存储过程会另起一个事务?
[/Quote]
调用的过程是自治事务的话,自治事务的提交不会引起外部调用过程的提交。。。
wypudong 2010-04-21
  • 打赏
  • 举报
回复
看了下Oracle事务的说明,没有一个说明说同一个存储过程中执行的DML语句会拆分成2个事务。
无解。。。。。。
有谁对Oracle的事务比较清楚地,帮忙解释一下我的问题。
还是说存储过程中调用另一个存储过程会另起一个事务?
gll0809 2010-04-21
  • 打赏
  • 举报
回复
关注...
wypudong 2010-04-21
  • 打赏
  • 举报
回复
现在觉得奇怪的地方是:提交的时候,这个存储过程中的部分数据库操作被提交了。
在做事务提交的时候,同一个存储过程涉及到的数据库操作,被拆分了提交吗?
wypudong 2010-04-21
  • 打赏
  • 举报
回复
不能放到存储过程里面,这是一个串行的事务,整个事务中,有任何一步有问题,一整个事务都要回滚。其中调用的存储过程,其他地方也要调用,是通用的。
tangren 2010-04-21
  • 打赏
  • 举报
回复
试着将JAVA里的事务放到存储过程中,由存储过程来进行提交和回滚。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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