VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 823|回复: 6

事务的回滚问题

[复制链接]

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-19 15:00:01 | 显示全部楼层 |阅读模式
我在存储过程中要调用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

回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-26 17:45:02 | 显示全部楼层
是否在要调用的每个存储过程中返回个值,再根据这个返回的值来判断是否要rollback
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-27 10:15:01 | 显示全部楼层
在一个存储中出错误就要中止掉此存储后面的语句,该如何写呢?

CREATE PROCEDURE  OnlineUpdateData
@UserName                 VARCHAR( 50 ) ,
@ContractID                      UNIQUEIDENTIFIER ,
@ErrMessage                 BIT  OUTPUT,
@RollBackFalg                INT OUTPUT       
AS

        -----更新 MST_AirlineId  和  FraeGoupID
        UPDATE OnlineTempTable
                SET MST_AirlineId = dbo.GetAirlineIDByAirCode( OAIR ) , FraeGoupID = dbo.GetFBGroupID( FB,@ContractID )
                WHERE Operator = @UserName  --AND  Error <> 'N'

        IF   @@ERROR<>0    SET @RollBackFalg=1
---在此语句出错就返回,如何写呢,我就是设RollBackFalg=1,就返回到的调用此存储的存储,然后根据RollBackFalg进行rollback


INSERT INTO .......

Go

谢谢!
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-4-28 22:30:01 | 显示全部楼层
是的,你应该从被调用的存储过程返回值进行判断,而作出事务的处理决定。
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-22 12:45:01 | 显示全部楼层
还有其它的建议吗?
等候中,谢谢!
回复

使用道具 举报

0

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-30 01:00:01 | 显示全部楼层
@@error是用来判断最近的SQL语句执行成功与否的全局函数,不建议楼主使用这个东西判断存储过程是否执行成功,相反地你应该在每个存储过程中使用这个函数来返回不同的值用来标志你的存储过程是否执行成功。使用return返回存储过程的结果,就好像C语言的函数一样的。在调用存储过程时候根据return的返回值判断是否执行成功就可以了。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-31 15:15:02 | 显示全部楼层
使用TRY CATCH. 里边的任何一个存储过程出问题,要它抛异常,外边的sp一旦catch任何exception
就rollback
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表