2011-04-11 71 views
12

Aquí hay un problema extraño que me estoy encontrando en un servidor de producción. Ha sucedido dos veces en las últimas dos semanas, y este es un servidor que recibe mucho tráfico.La solicitud de COMMIT TRANSACTION no tiene BEGIN TRANSACTION correspondiente

Tenemos un código en un servicio web que ejecuta un BEGIN TRAN, luego ejecuta algunas consultas SQL (dos insertos seguidos por una actualización). Luego, al final ejecuta un COMMIT. Ya hemos recibido dos veces el mensaje en los registros:

La solicitud de COMMIT TRANSACTION no tiene BEGIN TRANSACTION correspondiente.

Entre los dos primeros insertos y la actualización, se llama a otro servicio web, por lo que podría haber un ligero retraso entre los dos primeros insertos y última actualización antes de la COMMIT se llama. ¿Podría esto estar causando nuestro problema? Estamos ejecutando esto en IIS 7 y Server 2008 R2 (todos aplicados).

Originalmente pensamos que podría ser que las piscinas de la aplicación se reciclaran, pero cambiaron eso para reciclar en el medio de la noche. Ahora no estoy seguro de qué haría que SQL Server olvidara la llamada al BEGIN TRAN.

Este servicio web se llama bastante. ¿Alguien ha visto algo así antes? Estoy en una pérdida total en este momento ...

¡Cualquier ayuda o sugerencia apreciada en gran medida!

+0

y también hay un error relacionado con este - http://support.microsoft.com/kb/810100/en-us – Steam

Respuesta

21

Parece que su transacción ha fallado, consiguió rodar hacia atrás y no hay nada para cometer

ejemplo de tal cosa

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

Ahora ejecutar este

BEGIN TRAN 

INSERT BlaTest VALUES('a') 
GO 

COMMIT TRAN 

Aquí está el error

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. 

Esto ejecutará sin problemas

BEGIN TRAN 

INSERT BlaTest VALUES(5) 
GO 

COMMIT TRAN 

Un buen artículo sobre las transacciones es Error Handling in SQL 2005 and Later por Erland Sommarskog

+0

Eso no tiene ningún sentido para mí. Si la transacción falla, ¿no sería el mensaje de error diferente? – Sophtware

+0

Ver código agregado Publiqué – SQLMenace

+6

+1 - Solución fácil para esto, @sophtware, es agregar 'IF @@ TRANCOUNT> 0 COMMIT TRAN'. Esto verifica las transacciones abiertas. Puedes hacer lo mismo antes de un 'ROLLBACK'. – JNK

0

que tenía el mismo problema. Esto es lo que hice para resolverlo.

La solicitud COMMIT TRANSACTION no tiene la correspondiente BEGIN TRANSACTION

Después comprobé la SQL consulta y agregue un BEGIN TRAN será ejecutado con éxito. Aquí mi código de muestra. Funcionará:

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)+'-'[email protected], 
     IsActive=0 
     where [email protected] and [email protected]      
     if(@@ERROR=0) 
      begin 
      commit Tran 
      select 0 
      end 
     else 
      begin 
      rollback Tran 
      select -1 
      end 


    end 
+0

no es un ejemplo, me pasó. Así que compartí las respuestas de cómo se verá esto. Gracias – Praveen04

Cuestiones relacionadas