Nombre de transactions après EXECUTE indique un décalage certain nombre de COMMENCER et de s'ENGAGER?

Question: j'ai ce script SQL:

DECLARE @in_TE_UID varchar(36) 
DECLARE @in_ZO_BETE_Sort int 
DECLARE @in_user int 
SET @in_TE_UID = '9f510440-8828-44ce-bbea-6bc866902262'
SET @in_ZO_BETE_Sort = 0 
SET @in_user = 12435
-- http://stackoverflow.com/questions/884334/tsql-try-catch-transaction-in-trigger
BEGIN TRANSACTION BeforeUpdate;
BEGIN TRY
IF NOT EXISTS 
(
SELECT 1 FROM T_FMS_ZO_Benutzer_TeaserOrder 
WHERE (T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_Status = 1) 
AND (T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_BE_ID = @in_user) 
AND 
(
T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_TE_UID = @in_TE_UID 
OR 
(
@in_TE_UID IS NULL 
AND 
T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_TE_UID IS NULL 
) 
)    
)
BEGIN
INSERT INTO T_FMS_ZO_Benutzer_TeaserOrder 
(
ZO_BETE_UID
,ZO_BETE_BE_ID
,ZO_BETE_TE_UID
,ZO_BETE_Sort
,ZO_BETE_Status
)
VALUES
(
NEWID() --<ZO_BETE_UID, uniqueidentifier,>
,@in_user --<ZO_BETE_BE_ID, int,>
,@in_TE_UID --<ZO_BETE_TE_UID, uniqueidentifier,>
,@in_ZO_BETE_Sort --<ZO_BETE_Sort, int,>
,1 --<ZO_BETE_Status, int,>
)
;
END
ELSE
BEGIN
UPDATE T_FMS_ZO_Benutzer_TeaserOrder  
SET  ZO_BETE_Sort = @in_ZO_BETE_Sort 
WHERE (T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_Status = 1) 
AND (T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_BE_ID = @in_user) 
AND 
(
T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_TE_UID = @in_TE_UID 
OR 
(
@in_TE_UID IS NULL 
AND 
T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_TE_UID IS NULL 
) 
) 
;
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION BeforeUpdate --RollBack in case of Error
--RETURN
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT 
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH

Il fonctionne très bien quand je le lance une fois.

Ensuite, si je lance un

SELECT * FROM T_FMS_ZO_Benutzer_TeaserOrder

puis c'délais d'attente.

Si j'ajoute with (nolock), alors il fonctionne.

Si je regarde les processus dans SSMS, je vois un verrouillée, sélectionnez avec LCK_M_S.

Si je exécuter la même commande dans le code, j'ai toujours cette erreur:

Nombre de transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations. Nombre précédent = 0, compteur = 1

Alors, vraiment, quel est le problème avec ce code ?