hur.cn - 华软网

 热门搜索

求助: 事务不能全部回滚

  作者:未知    来源:网络    更新时间:2018/5/16
SQLCA.AutoCommit = False
UPDATE T_WL_YJB SET 数据确认 = 1 WHERE 数据确认 = 0;
IF SQLCA.Sqlcode = -1 THEN
   ROLLBACK;
   MessageBox('错误','月结表数据更新错误,请重试!~n' + SQLCA.SqlErrText,StopSign!)
   RETURN
END IF
UPDATE T_WL_KCJC SET 确认 = 1 WHERE 确认 = 0;
IF SQLCA.Sqlcode = -1 THEN
   ROLLBACK;
   MessageBox('错误','月结明细表数据更新错误,请重试!~n' + SQLCA.SqlErrText,StopSign!)
   RETURN
END IF
UPDATE T_WL_WLRK SET 确认 = 1 WHERE 确认 = 0 and 入库时间 <= :ldt_date;
IF SQLCA.Sqlcode = -1 THEN
   ROLLBACK;
   MessageBox('错误','物料入库数据更新错误,请重试!~n' + SQLCA.SqlErrText,StopSign!)
   RETURN
END IF
UPDATE T_WL_WLCK SET 确认 = 1 WHERE 确认 = 0 and 出库时间 <= :ldt_date;
IF SQLCA.Sqlcode = -1 THEN
   ROLLBACK;
   MessageBox('错误','成品出库数据更新错误,请重试!~n' + SQLCA.SqlErrText,StopSign!)
   RETURN
END IF
UPDATE T_WL_SGD SET 确认 = 1 WHERE 确认 = 0 and 日期 <= :ldt_date;
IF SQLCA.Sqlcode = -1 THEN
   ROLLBACK;
   MessageBox('错误','物料出库数据更新错误,请重试!~n' + SQLCA.SqlErrText,StopSign!)
   RETURN
END IF
COMMIT;
这上这段代码更新5个数据表,当事务回滚时只能回滚一个更新语句,如更新第3个表出错,那么第1\2个表的数据还是被更新了.
数据库采用的是MS SQL2000 + WIN2K SVR
这几个数据表都有修改触发器,触发器中也有定义事务及提交事务(我想这应该不会有问题吧)
请大家指点一二,谢谢!
------华软网友回答------

如果仅仅根据你上面的代码来看,

逻辑没什么问题。

如果你的表中定义有触发器,估计问题就出在那儿。

触发器一般不会有定义事务及提交事务的概念。


另外,你的表名称为什么用中文简写字母,在我公司老总严令禁止这种命名方式,

呵呵……
------华软网友回复------
SQL的帮助上说可以支持嵌套事务,原文如下:
Microsoft&reg; SQL Server&#8482; 忽略提交内部事务。根据最外部事务结束时采取的操作,将提交或者回滚事务。如果提交外部事务,则内层嵌套的事务也会提交。如果回滚外部事务,则不论此前是否单独提交过内层事务,所有内层事务都将回滚。
难道是定义在PB上的事务不能和触发器的事务嵌套吗?

TO:rodgerwu() 
触发器中我还要更新其他表(有多个表)中的相关数据,不用事务也行吗?能保证回滚吗?
我的程序只是应用于自己公司内部,我们不是软件公司,当初为了自己看着方便就定义了中文字段名了,现在想改,又怕麻烦,呵呵.
------华软网友回复------
对于触发器事务,还有这么一段话:
当执行触发器时,触发器的操作总是好像有一个未完成的事务在起作用。如果激发触发器的语句是在隐性或显式事务中,则肯定会这样。在自动提交模式下,也是如此。当语句开始以自动提交模式执行时,如果遇到错误,则会有隐含的 BEGIN TRANSACTION 语句允许恢复该语句生成的所有修改。该隐含的事务对批处理中的其它语句没有影响,因为当语句完成时,该事务要么提交,要么回滚。但是,当调用触发器时,该隐含的事务将仍然有效。

这意味着,只要触发器中发出 BEGIN TRANSACTION 语句,则实际上就开始了一个嵌套事务。因为当回滚嵌套事务时,嵌套的 BEGIN TRANSACTION 语句将被忽略,触发器中发出的 ROLLBACK TRANSACTION 总是回滚过去该触发器本身发出的所有 BEGIN TRANSACTION 语句。ROLLBACK 回滚到最外部的 BEGIN TRANSACTION。
…………
BEGIN TRANSACTION 总是启动一个嵌套事务。COMMIT TRANSACTION 只提交嵌套事务,而下面的 ROLLBACK TRANSACTION 则一直回滚到最外部的 BEGIN TRANSACTION。

这说明触发器的事务是嵌套在外部事务的呀.

------华软网友回复------
你的代码是正确的,关键还是触发器的问题,在触发器内面不要写COMMIT语句
------华软网友回复------
哦,谢谢,我先试试      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。