更新时间:2023-11-29 14:43:10
我建议使用第一个构造,在SQL 2012及更高版本中,使用THROW重新引发原始错误。此外,将SET XACT_ABORT_ON添加到proc的下注中以确保在客户端超时的情况下立即回滚事务,因为在这种情况下不执行CATCH
块。
I suggest the first construct and, in SQL 2012 and later, use THROW to re-raise the original error. Also, add SET XACT_ABORT_ON to the betting of the proc to ensure the transaction is rolled back immediately in the event of a client timeout since the CATCH block is not executed in that case.
CREATE PROCEDURE DummyProc
AS
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
INSERT sometable(a, b) VALUES (@a, @b);
INSERT sometable(a, b) VALUES (@b, @a);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO