次のsprocは、この記事のテンプレートに従って実装されています。例外処理とネストされたトランザクション。このsprocはデッドロックを処理することになっており、すでにトランザクションを作成している別のsprocによって呼び出されます。次の例外が発生するため、内部トランザクションのBEGIN/COMMITの一部のマジックが一致しませんTransaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0
。私が理解している限り、catchは実行され、@xstate = -1
trueであり、外部トランザクション全体がロールバックされます。
不一致が発生するアイデアはありますか?
CREATE PROCEDURE [dbo].[mysproc]
AS
BEGIN
SET NOCOUNT ON;
SET DEADLOCK_PRIORITY LOW;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRY
DECLARE @trancount int;
SET @trancount = @@TRANCOUNT;
IF (@trancount = 0)
BEGIN TRANSACTION;
ELSE
SAVE TRANSACTION InnerTran;
--
-- do some work that can potentially cause a deadlock
--
END TRY
BEGIN CATCH
DECLARE @xstate int
SELECT @xstate = XACT_STATE()
IF (@xstate = - 1)
ROLLBACK;
IF (@xstate = 1 and @trancount = 0)
ROLLBACK;
IF (@xstate = 1 and @trancount > 0)
ROLLBACK TRANSACTION InnerTran;
END CATCH
END
GO