Se pierden transacciones

02/09/2004 - 10:52 por Albert | Informe spam
Desde hace unos dias una aplicación que trabaja con SQL
Server 2000 SP3, pierde inserts que se hacen en una misma
transaccion. Se que es muy raro pero aparece el problema
muy aleatoriamente y la situación es insostenible, tengo
dudas si se trata del virus Slammer que afecta a SQL
Server. Si alguien sabe algo de todo esto agradeceria toda
la información que pudiera darme.

Muchas Gracias.

Preguntas similare

Leer las respuestas

#1 albert
02/09/2004 - 12:50 | Informe spam
Gracias por la respuesta. Efectivamente llamamos a un
procedimiento, pero dentro del cual no se realiza ninguna
instruccion COMMIT ni ROLLBACK.

Antes he olvidado de comentar que la parte que no se
ejecuta de la transacción és precisamente la primera.
Parece que "alguien" realizara un rollback.

También debería haber comentado que las transacciones son
excepcionalmente largas, pero en este caso es inevitable.

Por último, hemos detectado también que el problema se
produce siempre cuando hay mucha carga en el SQLSERVER
(bloqueos, etc...). Mi sospecha inicial era que el
SQLSERVER al detectar un problema (deadlock, ..o alguna
cosa así) realiza un ROLLBACK sin notificar a nuestro
programa la excepcion producida, con lo cual a la
siguiente instruccion SQL se inicia una transaccion
implícita que acaba normalmente con un COMMIT.

¿podría ser que las excepciones ocurridas dentro de un
procedimiento no notificaran al programa que se han
producido?

¿cómo podríamos controlar que al realizar nuestro commit
estamos realmente en la misma transacción?


Grácias
Respuesta Responder a este mensaje
#2 Javier Loria
02/09/2004 - 14:02 | Informe spam
Hola:
La variable @@TRANCOUNT te indica el nivel de anidamiento de las
transaccion de manera que cada BEGIN TRAN le suma uno y cada COMMIT le resta
uno. Revisa el varlor. El ROLLBACK cancela todos.
Adicionalmente revisa los Triggers ya que un mal manejo de transacciones
en estos produce problemas de este tipo. Revisa que en caso de errores se
hga tanto ROLLBACK como RAISERROR y que los procedimientos revisen el
control de errores @@Error inmediatamente despues de hacer el
INSERT/UPDATE/DELETE.
Podrias usar el Profiler para capturar las sentencias que se enviaron al
servidor y revisar luego en una maquina de pruebas, lo que esta ocurriendo.
Por ultimo puede servirte un procedimiento que existe en
http://www.configuracionesintegrale...p?articulo!7
Para monitorear una tabla.
Suerte,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda


"albert" wrote in message
news:4bc701c490da$b8846090$
Gracias por la respuesta. Efectivamente llamamos a un
procedimiento, pero dentro del cual no se realiza ninguna
instruccion COMMIT ni ROLLBACK.

Antes he olvidado de comentar que la parte que no se
ejecuta de la transacción és precisamente la primera.
Parece que "alguien" realizara un rollback.

También debería haber comentado que las transacciones son
excepcionalmente largas, pero en este caso es inevitable.

Por último, hemos detectado también que el problema se
produce siempre cuando hay mucha carga en el SQLSERVER
(bloqueos, etc...). Mi sospecha inicial era que el
SQLSERVER al detectar un problema (deadlock, ..o alguna
cosa así) realiza un ROLLBACK sin notificar a nuestro
programa la excepcion producida, con lo cual a la
siguiente instruccion SQL se inicia una transaccion
implícita que acaba normalmente con un COMMIT.

¿podría ser que las excepciones ocurridas dentro de un
procedimiento no notificaran al programa que se han
producido?

¿cómo podríamos controlar que al realizar nuestro commit
estamos realmente en la misma transacción?


Grácias
Respuesta Responder a este mensaje
#3 Adrian D. Garcia
02/09/2004 - 18:26 | Informe spam
Verifica si las tablas afectadas en la transaccion tienen
triggers/desencadenadores. En los cursos que doy tengo un ejemplo tipico de
un trigger que hace un rollback de una transaccion implicita sin que la
misma genere un error que llega al usuario o al SP que lo invoca.
Si dentro del codigo de un trigger haces un ROLLBACK sin reakizar un
RAISERROR se genera la situacion que planteas.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"albert" wrote in message
news:4bc701c490da$b8846090$
Gracias por la respuesta. Efectivamente llamamos a un
procedimiento, pero dentro del cual no se realiza ninguna
instruccion COMMIT ni ROLLBACK.

Antes he olvidado de comentar que la parte que no se
ejecuta de la transacción és precisamente la primera.
Parece que "alguien" realizara un rollback.

También debería haber comentado que las transacciones son
excepcionalmente largas, pero en este caso es inevitable.

Por último, hemos detectado también que el problema se
produce siempre cuando hay mucha carga en el SQLSERVER
(bloqueos, etc...). Mi sospecha inicial era que el
SQLSERVER al detectar un problema (deadlock, ..o alguna
cosa así) realiza un ROLLBACK sin notificar a nuestro
programa la excepcion producida, con lo cual a la
siguiente instruccion SQL se inicia una transaccion
implícita que acaba normalmente con un COMMIT.

¿podría ser que las excepciones ocurridas dentro de un
procedimiento no notificaran al programa que se han
producido?

¿cómo podríamos controlar que al realizar nuestro commit
estamos realmente en la misma transacción?


Grácias
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida