web-dev-qa-db-fra.com

La demande COMMIT TRANSACTION n'a pas de BEGIN TRANSACTION correspondante.

Voici un problème étrange que je rencontre sur un serveur de production. C'est arrivé deux fois au cours des deux dernières semaines et il s'agit d'un serveur qui reçoit beaucoup de trafic.

Nous avons du code dans un service Web qui exécute un BEGIN TRAN, puis quelques requêtes SQL (deux insertions suivies d'une mise à jour). Puis à la fin exécute une COMMIT. Deux fois, nous avons reçu le message dans les journaux:

La demande COMMIT TRANSACTION n'a pas de BEGIN TRANSACTION correspondante.

Entre les deux premières insertions et la mise à jour, nous appelons un autre service Web. Il peut donc y avoir un léger délai entre les deux premières insertions et la dernière mise à jour avant l'appel de la COMMIT. Cela pourrait-il causer notre problème? Nous l’utilisons sous IIS 7 et Server 2008 R2 (toutes les mises à jour sont appliquées).

À l’origine, nous pensions que les piscines d’applications pouvaient être recyclées, mais nous avons modifié le système pour le recycler au milieu de la nuit. Maintenant, je ne suis pas sûr de ce qui pourrait amener SQL Server à oublier l'appel à BEGIN TRAN.

Ce service Web est souvent appelé. Quelqu'un a-t-il déjà vu quelque chose comme ça? Je suis totalement perdu en ce moment ... 

Toute aide ou suggestion est grandement appréciée! 

15
Sophtware

On dirait que votre transaction a échoué, a été annulée et qu'il n'y a rien à commettre

exemple d'une telle chose

CREATE TABLE BlaTest(id INT PRIMARY KEY NOT NULL)
GO

Maintenant, lancez cette

BEGIN TRAN

INSERT BlaTest VALUES('a')
GO

COMMIT TRAN

Voici l'erreur

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value 'a' to data type int.
Msg 3902, Level 16, State 1, Line 2
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

Cela fonctionnera sans problème

BEGIN TRAN

INSERT BlaTest VALUES(5)
GO

COMMIT TRAN

Un bon article sur les transactions est Traitement des erreurs dans SQL 2005 et ultérieur par Erland Sommarskog

28
SQLMenace

J'ai eu le même problème. C'est ce que j'ai fait pour le résoudre.

La demande COMMIT TRANSACTION n'a pas de BEGIN TRANSACTION correspondant

Après avoir vérifié la requête SQL et ajouter un BEGIN TRAN, l'exécution sera réussie. Ici mon exemple de code. Ça va marcher:

ALTER procedure [dbo].[DeactivateUser]
    @UserId bigint,
    @LoginEmail Nvarchar(100),
    @merchantId int
    as
    Begin
      Begin tran

        update Users set 
        LoginEmail='inactive'+CONVERT(VARCHAR(11), getdate(), 106)+'-'+@LoginEmail,
        IsActive=0 
        where LoginEmail=@LoginEmail and MerchantID=@merchantId                     
        if(@@ERROR=0)
          begin
            commit Tran
            select 0
          end
        else
          begin
            rollback Tran
            select -1
          end


    end
0
Praveen04