数据提交并发控制问题之一(附代码,请高手捉虫),在线献分!

pigherd 2003-04-16 07:27:30
代码如下:

long sn = 0

if dw_1.update(true,false) = 1 and dw_2.update(true,false) = 1 and dw_3.update(true,false) = 1 and dw_4.update(true,false) = 1 and dw_5.update(true,false) = 1 then
commit using sqlca;
dw_1.resetupdate()
dw_2.resetupdate()
dw_3.resetupdate()
dw_4.resetupdate()
dw_5.resetupdate()
else
rollback using sqlca;
messagebox('提示窗',"数据提交失败,请重试!",exclamation!)
return
end if

if sqlca.sqlcode <> 0 then
messagebox("提示窗","提交数据失败,错误类型为:" + string(sqlca.sqlcode) + sqlca.sqlerrtext,exclamation!)
return
end if

sn = sn + 1


正常情况下上述语句执行无误,每提交一次,sn加1,提交失败,sn不会加1。
但是最近却出现了一次异样情况:

当时机器a中上述各dw正在update时,另一台机器b上正在用sql语句执行删除dw_1对应的表里的数据。机器a出现了英文提示,并且sn没有加1,但我发现dw_1至dw_5该笔数据竟然都保存进数据库了,这就比较奇怪了,我分析出现英文提示说明commit语句执行失败,return自然sn就不会加1,但是数据怎么又给保存了呢?


请高手分析,事关重大,请大家给出相应的解释
并且欢迎大家指出上述语句的问题所在,言请凿凿。
...全文
36 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigherd 2003-04-18
  • 打赏
  • 举报
回复
楼上发混了吧,呵呵!
tchatcha 2003-04-18
  • 打赏
  • 举报
回复
LONG BZ_RETURN = 1

//转移A
INSERT INTO C SELECT * FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
DELETE FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF

//转移B
INSERT INTO D SELECT * FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
DELETE FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
COMMIT;
aa:
//修改E
IF BZ_RETURN = 0 THEN
UPDATE E SET BZ = '0';
ELSE
UPDATE E SET BZ = '1';
END IF

COMMIT;

IF SQLCA.SQLCODE <> 0 then
messagebox("提示窗","提交数据失败,错误类型为:" + string(SQLCA.SQLCODE) + SQLCA.SQLERRTEXT,EXCLAMATION!)
RETURN
END IF
pigherd 2003-04-18
  • 打赏
  • 举报
回复
算了,结了吧
huangxinru 2003-04-18
  • 打赏
  • 举报
回复
对应的sqlerrtext的值是什么
pigherd 2003-04-17
  • 打赏
  • 举报
回复
楼上,我注意看过,那几个dw都commit成功了
bomber2001 2003-04-17
  • 打赏
  • 举报
回复
是不是commit里面有些成功了
pigherd 2003-04-17
  • 打赏
  • 举报
回复
UP
pigherd 2003-04-17
  • 打赏
  • 举报
回复
楼上,autocommit = false没问题。


今天我又分析了一下,我怀疑是这样的:

a机器上各dw的update进行commit时的确成功了,接着b机器的sql语句连这些才commit的数据也一起删除了,之后a机器中才执行了下面这一段用于检测commit是否执行成功的代码:
if sqlca.sqlcode <> 0 then
messagebox("提示窗","提交数据失败,错误类型为:" + string(sqlca.sqlcode) + sqlca.sqlerrtext,exclamation!)
return
end if

由于此时数据已经被删除,所以上述代码认为commit失败,出现英文提示后停止后面的执行。

请大家提出宝贵意见,上述情况可能吗?

oliveinfo 2003-04-17
  • 打赏
  • 举报
回复
是不是将事务设置成自动提交了?
pigherd 2003-04-17
  • 打赏
  • 举报
回复
up
hopefire 2003-04-16
  • 打赏
  • 举报
回复
如果五个数据窗口的数据有关联 应该分别提交。
pigherd 2003-04-16
  • 打赏
  • 举报
回复
楼上的删除操作的提交没问题。
那么怎么解释英文提示呢?
girlyz1999 2003-04-16
  • 打赏
  • 举报
回复
肯定已经提交了!!
你那个删除的操作是否完成后都有提交呀!
最好在更新、删除、修改数据时顺便都提交一下!!!
pigherd 2003-04-16
  • 打赏
  • 举报
回复
up

1,077

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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