日期:2014-05-19  浏览次数:20630 次

事务的回滚问题
我在存储过程中要调用n个别的存储,一个存储不成功,就要回滚,改如何来作呢?

CREATE   PROCEDURE     OnlineHanding    
      @UserName   VARCHAR(   50   ),
      @ContractID                             UNIQUEIDENTIFIER
AS

BEGIN   TRANSACTION

DECLARE       @ErrMessage                   BIT
   
-----第一步处理不合格数据
EXEC   OnlineCheckData   @UserName  

------更新     MST_AirlineId     和     FraeGoupID     ,RoutingI,以及检查和插入Routing和插入相关的表AirPortGroup,AirPortElement
EXEC   OnlineUpdateData   @UserName,   @ContractID   ,@ErrMessage   OUTPUT

--其他的操作......

...........

IF   @@ERROR   =   0
  COMMIT   TRANSACTION
ELSE

  ROLLBACK   TRANSACTION
--这句delete是一定要做的
DELETE     OnlineTempTable       WHERE   Operator   =   @UserName
GO



------解决方案--------------------
是的,你应该从被调用的存储过程返回值进行判断,而作出事务的处理决定。
------解决方案--------------------
关注

------解决方案--------------------
@@error是用来判断最近的SQL语句执行成功与否的全局函数,不建议楼主使用这个东西判断存储过程是否执行成功,相反地你应该在每个存储过程中使用这个函数来返回不同的值用来标志你的存储过程是否执行成功。使用return返回存储过程的结果,就好像C语言的函数一样的。在调用存储过程时候根据return的返回值判断是否执行成功就可以了。