sqlserver 中在存储过程中的嵌套事物

TransProc 过程强制执行其事务,而不管执行事务的进程的事务模式。如果在事务活动时调用 TransProc,很可能会忽略 TransProc 中的嵌套事务,而根据对外部事务采取的最终操作提交或回滚其 INSERT 语句。如果由不含未完成事务的进程执行 TransProc,则在该过程结束时,COMMIT TRANSACTION 将有效地提交 INSERT 语句。

CREATE TABLE TestTrans(Cola INT PRIMARY KEY,
               Colb CHAR(3) NOT NULL);
GO
ALTER PROCEDURE TransProc @PriKey INT, @CharCol CHAR(3),@error_out int output AS
BEGIN TRANSACTION InProc_1
    INSERT INTO TestTrans VALUES (@PriKey, @CharCol)
    INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol)
set @error_out=@@error
COMMIT TRANSACTION InProc_1;
GO
ALTER PROCEDURE TransProc_2 @PriKey INT, @CharCol CHAR(3), @error_out int output AS
BEGIN TRANSACTION InProc
    INSERT INTO TestTrans VALUES (@PriKey + 2, @CharCol)
    INSERT INTO TestTrans VALUES (@PriKey + 3, @CharCol)
set @error_out=@@error
COMMIT TRANSACTION InProc;
GO
BEGIN TRANSACTION OutOfProc;
DECLARE @ERROR INT;
EXEC TransProc 100, 'aaa',@error_out=@ERROR output
EXEC TransProc_2  200,  'bbb' ,@error_out=@ERROR output;
print(@ERROR)
IF ( @ERROR <= 0 ) BEGIN
    PRINT('提交事物')
    COMMIT TRANSACTION OutOfProc;
END ELSE BEGIN
    PRINT('事物回滚')
    ROLLBACK TRANSACTION OutOfProc;
END
GO

当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/cbcaa433-58f2-4dc3-a077-27273bef65b5.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值