日期:2014-05-20  浏览次数:20666 次

WorkFlow中,审批结果已经写入数据库,但是不知道怎么回事,又回滚了?急!急!急!
各位大虾,我在做一个转班申请的工作流,EJB+JSF+oracle9i+jboss,各级审批一般情况下没有问题,统计大概有5%的单出现了这样一个情况:就是审批人填写审批结果后,数据已经写入了数据库,(我加了一个Update触发器可以查询到那张表里面变化的数据),接着,不知道什么情况,原来的数据居然回滚了。而且只有审批人中的某一个会这样。我开始以为是Connection没有关闭,但是在finally语句中加了close().说明连接关闭,数据也提交了。



图中,AUDIT_REMARKS表示的是Update之前(before)和之后(after)的状态,Status列,C表示审批完成,N表示未审批,可以看出,原来的状态是从未审批到审批完成,其实流程就是需要这样的,但是,出乎意料的是,它在后面又回滚了,从C变成了N,而且date_added时间居然莫名其妙变成--00:00,理应该date_added时间不应该变化,真是让人费解啊。
求大家指教!


------解决方案--------------------
你没跟一下代码 看看在哪句回滚的
------解决方案--------------------
顶楼上
------解决方案--------------------
是不是事物影响的,不可能没有设置又自动回滚,要么就是数据出异常了,自动回滚了
------解决方案--------------------
finally不可靠,是最后的一个防护网而已。
------解决方案--------------------
我估计可能是并发争用资源发生死锁引起回滚。
所以事务少的时候,不出状况,一多了就出现。

举个例子来说,假如事务A按顺序修改记录a,b,c然后提交, 事务B安顺序修改c,b,d然后提交。
那么AB并发时就有可能由于争用bc死锁,最终导致回滚。

检测你的事务,确定是否每个事务占用的资源都是原子的,或者以固定顺序占用资源。

容器管理事务很可能做不到这么细,最好还是手工确定事务边界。
------解决方案--------------------
从你11楼的描述看不是混滚了,或者说不是事务的问题,因为你触发器里的记录被保存下来了,如果回滚的话触发器里的记录也会回滚的
是不是执行了一条update
你可以查一下丢失更新,有可能是这个问题
------解决方案--------------------
存进去的数据没了跟回滚有啥关系?怎么可能是回滚造成的?肯定是在哪又给删除了,只要已经提交的数据就不可能回滚了