微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,@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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐