请大家找BUG!
有两个表:A,B 用DW来 UPDATE保存第一个表A后,再用UPDATE语句来保存第二 个表B后,发现有时会出现只更新了其中一个表的情况,出错几率大概为千分之一 ,但这就足够叫人头疼的了,细节如下,请大家抓虫:
if DW_a.update() = 1 then // 保存表A
else
messagebox('','error1')
rollback;
return
end if
update B set cost_sum = 1000 where sn = :sn_couter; / / sn_couter为变量
if sqlca.sqlcode <> 0 then //保存表B
rollback;
messagebox('','error2')
return
else
commit;
messagebox('','right!')
end if
如果有错误的话,那么正确的写法是什么?
如果保存数据中途网络故障或拥挤会不会造成只提交了一个表,如果存在这种情况的话有什么好地热解决之道?
谢谢大家!
if DW_a.update() = 1 then
commit;// 保存表A
update B set cost_sum = 1000 where sn = :sn_couter; / / sn_couter为变量,//保存表B
else
messagebox('','error')
rollback;
return
end if
给你改改程序吧
If dw_1.update() = 1Then
update B set cost_sum = 1000 where sn = :sn_couter;
If sqlca.sqlcode = 0 Then
Commit Using sqlca;
messageBox('','success')
Else
Rollback Using sqlca;
messageBox('False',sqlca.sqlerrtext)
End If
Else
Rollback Using sqlca;
messageBox('False',sqlca.sqlerrText)
End If
注意:将连接的autoCommit设置为False
首先感谢大家的回答!
keani(基恩)说这是不可能完全避免的问题,请问诸位是否如此?
另外,惭愧的很,兄弟对流方兄的"在同一个事务中处理你的数据窗和update语法"这句话理解不是很清楚,尚请明示,有例最好!谢谢!
提出以下二点:
1.在rollback或commit语句后加messagebox,不要在前面加,不然弹出这个错误提示后,如果用户不按确定将可能造成死锁
2.如果多个数据窗口进行更新操作,采用dw_1.update(true,false),dw_1.resetupdate()的方法,不然可能造成数据丢失。