回滚而不引发异常
本文关键字:异常 | 更新日期: 2023-09-27 18:33:49
在SQL Server 2008r2上,我们有一个存储过程,如下所示:
create procedure x(@arg1 as nvarchar(20), @arg2 ... )
as
begin
-- delete and insert values, depending on arguments
begin transaction;
delete from tblA where f1 = @arg1 ... ;
insert into tblB (a) select ... where f2 = @arg2 ... ;
commit transaction;
end;
我在 C# (.NET 4.5) 中使用 SqlCommand.ExecuteNonQuery()
方法调用此过程。所有异常都捕获try--- catch
现在,在此方法的文档中,它说"如果发生回滚,则返回值为 -1"。
问题:是否会发生回滚而没有出现异常?
到目前为止,如果 sql 语句无法执行,我们总是得到一个异常。但是,是否有回滚"自动"发生而不会引发异常的情况?
你能看看gbn的答案,交易模板吗包含 TRY CATCH ROLLBACK 模式的嵌套存储过程?
根据您的问题,我修改了在发生回滚时返回 -1 的过程。
CREATE PROCEDURE [Name]
@arg1 as nvarchar(20),
@arg2 as nvarchar(20)
AS
SET XACT_ABORT, NOCOUNT ON
DECLARE @starttrancount int
BEGIN TRY
SELECT @starttrancount = @@TRANCOUNT
IF @starttrancount = 0
BEGIN TRANSACTION
delete from tblA where f1 = @arg1 ... ;
insert into tblB (a) select ... where f2 = @arg2 ... ;
IF @starttrancount = 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
BEGIN
ROLLBACK TRANSACTION
RETURN -1
END
END CATCH
GO