我读了这个 Stackoverflow 问题 嵌套存储过程包含 TRY CATCH ROLLBACK 模式?
我需要澄清gbn已回答的事务模板。我不能在那里发表评论和提问。
CREATE PROCEDURE [Name]
AS
SET XACT_ABORT, NOCOUNT ON
DECLARE @starttrancount int
BEGIN TRY
SELECT @starttrancount = @@TRANCOUNT
IF @starttrancount = 0
BEGIN TRANSACTION
[...Perform work, call nested procedures...]
IF @starttrancount = 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
我的问题是!
为什么要使用?
SELECT @starttrancount = @@TRANCOUNT ,而不是直接使用@@TRANCOUNT ??
为什么要检查这个?
IF @starttrancount = 0 开始交易
IF @starttrancount = 0 提交事务
我是 transaction 新手,举例说明会很有帮助。谢谢 :)