我具有基本上插入数据的此过程。
Begin Transaction
Insert into [dbo].Values
(
EQ
)
values
(
@EQ
)
End
--Set @STATUSRet= 'Created'
--Set @ErrorRet= ''
Commit Transaction
End Try
Begin Catch
Set @STATUSRet= 'Failed'
Set @ErrorRet= (Select ERROR_MESSAGE())
Rollback Transaction
End Catch
现在,我想添加一段代码来调用另一个数据库服务器,并将数据插入到该服务器的表中,即远程插入。没关系,我会这样做,但是如果失败了,那将不影响我如上所述的当前数据插入过程,即,如果远程数据插入失败,则不应以任何方式影响先前的插入过程,并且应成功返回到调用应用程序的行为好像什么都没有发生。
控制交易的默认方法是auto-commit:
任何更改数据并自行执行的语句都是自动进行原子交易。变化是否影响一个行或数千行,它必须成功完成每一行致力于。您不能手动回滚自动提交交易。
因此,如果这两个插入未在显式事务中包装,这将是该行为。如果您有更多的代码块,则可以使用两个单独的显式事务块,如下所示:
DECLARE @ExecuteSecondTransaction BIT = 0;
-- local database
BEGIN TRY
BEGIN TRANSACTION;
-- CODE BLOCK GOES HERE
SET @ExecuteSecondTransaction = 1;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION
END;
-- GET ERRORS DETAILS OR THROW ERROR
END CATCH;
-- remote database
IF @ExecuteSecondTransaction = 1
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
-- CODE BLOCK GOES HERE
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION
END;
-- GET ERRORS DETAILS OR THROW ERROR
END CATCH;
END;