2018/10/30

Oracle事务中的DDL语句

最近一直都在跟Tiptop ERP战斗,User发现了一个严重的问题,采购订单自动发送邮件给厂商时,只有15个项次,但我们自己查询时居然是19项,用impdp把当天的数据翻出来看,也没发现问题。

只能去追查程序了,原来是因为sapmt540.4gl中有个函数t540_pmn25(),它的作用是检查请购单项次并将请购单项次的备注(pmo_file)写入采购单的备注(pmo_file),读写pmo_file采用了操作临时表x来完成。其处理方法本身没问题,但该函数又被函数t540_b()调用,而对于临时表x的DDL操作(此处是DROP TABLE)会使TRANSACTION失效,不再锁定pmm_file,从而导致User A还在编辑采购订单的单身,User B就已把该采购订单审核甚至发出了。

解决办法:读写pmo_file的部分,改为FOREACH请购单项次的pmo_file资料,重新对pmo01/pmo02/pmo03赋值后,再INSERT到采购单项次的pmo_file。

终极原因:Oracle的DDL不是事务性的,运行DDL语句将隐式地提交该会话的任何打开的事务。

没有评论: