Transacciones de ADO.NET y de SQL

21/06/2007 - 18:02 por Marianoh | Informe spam
Hola a todos:

Tengo una serie de sp's que tienen varias sentencias que deben
estas transaccionadas, pero estos sps se pueden llamar con o sin una
transaccion abierta desde ADO.NET.

Viendo que ROLLBACK dehace todas las transacciones abiertas y
COMMIT confirma la última transacción abierta,

¿esta bien el siguiente código?

DECLARE @TRANCOUNT_INICIAL INT
SET @TRANCOUNT_INICIAL = @@TRANCOUNT

INSERT/UPDATE...
IF @@ERROR <>0
BEGIN
IF @@TRANCOUNT > @TRANCOUNT_INICIAL
ROLLBACK TRAN
RETURN @@ERROR
END
INSERT/UPDATE...
IF @@ERROR <>0
BEGIN
IF @@TRANCOUNT > @TRANCOUNT_INICIAL
ROLLBACK TRAN
RETURN @@ERROR
END
...
ELSE
BEGIN
IF @@TRANCOUNT > @TRANCOUNT_INICIAL
COMMIT TRAN
END

Gracias.
 

Leer las respuestas

#1 Federico A Colli
21/06/2007 - 18:56 | Informe spam
Hola.
Compo desarrollador te puedo decir que las transacciones en el código (por
ejemplo VB) y las de los Sp son independientes, en realidad si ejecutas un
ROLLBACK a nivel de codigo se hara un rollback completo, pero si usas
transacciones en los SP estas estan en un ambito inferior, por lo que un
rollback dentro de estos solo afectará a la transaccion que se abrió denro
del SP.
Básicamente es un anidamiento de la forma:

Codigo app
Begin trans
|
|
| => Execute sp_XXX
Begin
|
|
|
|
| <= Rollback/Commit => Este rollback afecta a la
transaccion del SP
|
|
Rollback/Commit => Este rollback afecta la ejecucion completa del SP y
de lo que se haya ejecutado (desde el
codigo) antes o desdes del SP

Carpe diem, tempus fugit.
El hombre sabio no da las respuestas correctas, propone las preguntas
correctas (Claude Levi-Strauss).
La sabiduría no es un producto de la educación sino de toda una vida por
adquirirla (Albert Einstein).
El sabio puede sentarse en un hormiguero, pero sólo el necio se queda
sentado en él (Proverbio chino).

AUS Federico A. Colli


"Marianoh" escribió en el mensaje
news:
Hola a todos:

Tengo una serie de sp's que tienen varias sentencias que deben
estas transaccionadas, pero estos sps se pueden llamar con o sin una
transaccion abierta desde ADO.NET.

Viendo que ROLLBACK dehace todas las transacciones abiertas y
COMMIT confirma la última transacción abierta,

¿esta bien el siguiente código?

DECLARE @TRANCOUNT_INICIAL INT
SET @TRANCOUNT_INICIAL = @@TRANCOUNT

INSERT/UPDATE...
IF @@ERROR <>0
BEGIN
IF @@TRANCOUNT > @TRANCOUNT_INICIAL
ROLLBACK TRAN
RETURN @@ERROR
END
INSERT/UPDATE...
IF @@ERROR <>0
BEGIN
IF @@TRANCOUNT > @TRANCOUNT_INICIAL
ROLLBACK TRAN
RETURN @@ERROR
END
...
ELSE
BEGIN
IF @@TRANCOUNT > @TRANCOUNT_INICIAL
COMMIT TRAN
END

Gracias.

Preguntas similares