Sql server 在过程1内调用过程2时处理事务回滚
我有两个独立的存储过程,第二个在第一个存储过程的try块中调用 第一个程序框架代码:Sql server 在过程1内调用过程2时处理事务回滚,sql-server,stored-procedures,transactions,commit,rollback,Sql Server,Stored Procedures,Transactions,Commit,Rollback,我有两个独立的存储过程,第二个在第一个存储过程的try块中调用 第一个程序框架代码: CREATE PROCEDURE [dbo].[Procedure1] -- Parameters @procedure1_parameter AS SET ANSI_NULLS ON SET NOCOUNT ON SET XACT_ABORT ON BEGIN BEGIN TRANSACTION; BEGIN TRY EXEC [dbo].[Procedure2] @procedure2_p
CREATE PROCEDURE [dbo].[Procedure1]
-- Parameters
@procedure1_parameter
AS
SET ANSI_NULLS ON
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
EXEC [dbo].[Procedure2] @procedure2_parameter;
END TRY
BEGIN CATCH
SELECT
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
CREATE PROCEDURE [dbo].[Procedure2]
-- Parameters
@procedure2_parameter
AS
SET ANSI_NULLS ON
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
-- Procedure2 code
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorLine INT;
DECLARE @ErrorNumber INT;
DECLARE @ErrorProcedure NVARCHAR(200);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorProcedure = ERROR_PROCEDURE(),
@ErrorLine = ERROR_LINE(),
@ErrorMessage = ERROR_MESSAGE();
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
RAISERROR (@ErrorMessage,
@ErrorNumber,
@ErrorSeverity,
@ErrorState,
@ErrorLine,
@ErrorProcedure
);
END
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
第二个过程框架代码:
CREATE PROCEDURE [dbo].[Procedure1]
-- Parameters
@procedure1_parameter
AS
SET ANSI_NULLS ON
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
EXEC [dbo].[Procedure2] @procedure2_parameter;
END TRY
BEGIN CATCH
SELECT
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
CREATE PROCEDURE [dbo].[Procedure2]
-- Parameters
@procedure2_parameter
AS
SET ANSI_NULLS ON
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
-- Procedure2 code
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorLine INT;
DECLARE @ErrorNumber INT;
DECLARE @ErrorProcedure NVARCHAR(200);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorProcedure = ERROR_PROCEDURE(),
@ErrorLine = ERROR_LINE(),
@ErrorMessage = ERROR_MESSAGE();
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
RAISERROR (@ErrorMessage,
@ErrorNumber,
@ErrorSeverity,
@ErrorState,
@ErrorLine,
@ErrorProcedure
);
END
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
正如您所看到的,它们的代码几乎相同,除了第二个代码在catch块中引发了错误。若第二个过程失败,第一个过程是否应该捕获第二个过程引发的错误?当我们在第一个存储过程的try块中有第二个存储过程调用时,这是处理事务回滚/提交的正确方法吗?这是用于哪个RDBMS的?请添加一个标记来指定您是在使用
mysql
、postgresql
、sql-server
、oracle
还是db2
——还是完全其他什么。我使用的是sql server。