Rollback transacciones

13/09/2004 - 22:21 por fco | Informe spam
en el siguiente proc. almacenado:

begin tran

update tabla1 set campo1= 1
update tabla2 set campo1= 1

IF @@ERROR <> 0
ROLLBACK
ELSE
commit

se supone que si una instruccion falla @error es distinto
de 0, entonces deshace la transaccion con rollback, pero
en lugar de eso se ejecuta la instruccion que no falla y
ademas no confirma la transaccion y me arroja el siguiente
error:

"El recuento de transacciones después de EXECUTE indica
que falta una instrucción COMMIT o ROLLBACK TRANSACTION.
Recuento anterior = 1, recuento actual = 2."

¿alguien sabe como confirmar o deshacer las transacciones,
porque este ejemplo lo saque de la ayuda y no ma habia
dado cuenta que no funciona?

instrucciones obviamente la deshace, pero si esta despues
del if @error ... no lo reconoce..

Preguntas similare

Leer las respuestas

#11 ulises
14/09/2004 - 15:30 | Informe spam
Además de ser necesario siempre preguntar el IF @@error
por ser "buenas maneras de programación", lo que mencionas
tampoco es así, por ejemplo si tienes dos tablas :

create table uno ( valor int primary key)
create table dos ( valor int )

y un procedimiento almacenado que inserta registros en
ambas tablas de la siguiente manera :

create proc insertauno ( @valor int )
as
begin tran
insert into uno values ( @valor )
insert into dos values ( @valor )
commit

si ejecutas el procedimiento dos veces con el mismo valor :

exec insertauno 1
exec insertauno 1
select * from uno
select * from dos

obtendrás resultados incorrectos :

valor
1

(1 row(s) affected)

valor
1
1

(2 row(s) affected)

lo ideal es manejar el @@ERROR

alter proc insertauno ( @valor int )
as
begin tran
insert into uno values ( @valor )
if @@ERROR <> 0
begin
ROLLBACK TRAN
return(99)
end
insert into dos values ( @valor )
if @@ERROR <> 0
begin
ROLLBACK TRAN
return(99)
end
else
begin
COMMIT TRAN
return 0
end

con ello se producirán los rollback correspondientes.

Saludos,
Ulises

perdon el "o sea no es necesario
colocar commit o rollback ...", era un
if @@error <> o
rollback
else
commit

lo estuve provando antes de enviar el mensaje, sólo le
colocas begin tran y commit al final, no es necesario
preguntar por el @@error.

Ahí también hay un error, cuando marcas BEGIN TRAN estás


dando inicio
a una transacción explícita por lo tanto es necesario


realizar un
COMMIT, en caso que no se realice, al final de la


conexión se produce
un ROLLBACK automático de la transacción así no se haya


producido
errores en su ejecución.

Saludos,
Ulises

On Mon, 13 Sep 2004 18:34:27 -0700, "fco"
wrote:

ok, tienes razon.
Hasta, me di cuenta que ni siquiera es necesario






colocar
esa instruccion, porque con sólo colocar
"Begin tran"
el sql server es el que se encarga de confirmarlas o
deshacerlas si se produce un error, si esta configurado
para confirmar las transacciones automaticamente (que






en
la instalacion viene por defecto), o sea no es






necesario
colocar commit o rollback ... Excepto si son




transacciones
anidadas.




.



.

Respuesta Responder a este mensaje
#12 Chente
14/09/2004 - 18:31 | Informe spam
Cuando escribes mas de una sentencia y necesitas cerciorarte que todas se
realizen, entonces utiliza el Begin tran, cuando es solo una sentencia no es
necesario colocarlo.


Saludos.

Vicente López.




"fco" escribió en el mensaje
news:185e01c499eb$1ee33eb0$
Gracias a los que respondieron.

La solucion a este problema es que siempre estuvo
correcto... trabajo hace años con esta instruccion para
deshacer transacciones, creo que debe ser el sueño, ademas
a quien no le ha pasado algo así.

El problema esta cuando quieres actualizar o seleccionar
algo de una tabla que no existe
"update tabla_que_no_existe set campo1= 1"
entonces, en ese caso la transaccion no queda confirmada,
pero si introducimos un valor numerico por ejemplo en un
campo caracter se va a generar el error y entonces deshace
todas las operaciones.

Estuve leyendo sus respuestas y gracias, pero creo que lo
que yo coloco al final de todas las instruciones es lo
mejor. Si se dan cuenta yo sólo coloco una vez al final el
IF @@ERROR <> 0
ROLLBACK
ELSE
commit
..entonces no tenemos que colocarlo despues de cada
ejecucion.
instruccion es correcta, si dio un error en una sentencia
y si las demas estan correctas, se quedara con el valor
que genero el error.

¿En que estaba pensando, si esta instruccón como mencioné
la saque de la ayuda o de un libro de SQL SERVER (ya no me
acuerdo )? Obvio que tenía que estar correcta la
instruccion.



en el siguiente proc. almacenado:

begin tran

update tabla1 set campo1= 1
update tabla2 set campo1= 1

IF @@ERROR <> 0
ROLLBACK
ELSE
commit

se supone que si una instruccion falla @error es distinto
de 0, entonces deshace la transaccion con rollback, pero
en lugar de eso se ejecuta la instruccion que no falla y
ademas no confirma la transaccion y me arroja el


siguiente
error:

"El recuento de transacciones después de EXECUTE indica
que falta una instrucción COMMIT o ROLLBACK TRANSACTION.
Recuento anterior = 1, recuento actual = 2."

¿alguien sabe como confirmar o deshacer las


transacciones,
porque este ejemplo lo saque de la ayuda y no ma habia
dado cuenta que no funciona?

instrucciones obviamente la deshace, pero si esta despues
del if @error ... no lo reconoce..



.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida