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!
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
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