transaccion

01/06/2005 - 17:17 por Eduardo De Luca | Informe spam
Que tal , amigos . TEngo un problema que seguramente le estoy pifiando en el
codigo , tengo (en el codigo descrito abajo) programada un transaccion, y se
si produce un error en el update se vuelve para atras todo. El echo es que
produzo el error intencionalmete en un update pero igual me actualiza las
otras tablas.
Que estoy haciendo mal?

les paso el codigo



begin tran t1

update in_e1mov_aa set o_cuo_mov='0'
update in_e1mov_aa set v_mov_cta= alt_id from in_e1_alta_aut where
alt_tabla='cta' and alt_clave=o_cta_clave_mov
update in_e1mov_aa set v_mov_mon= mon_id from monedas where
rtrim(mon_nombre_corto)=rtrim(o_mon_mov) and mon_baja_fecha is null
update in_e1mov_aa set v_id_con_mov= con_id from conceptos where
rtrim(con_nombre_corto)=rtrim(o_con_mov) and con_baja_fecha is null
update in_e1mov_aa set v_id_scn_con= scn_id from sub_conceptos where
rtrim(scn_nombre_corto)=rtrim(o_scn_mov) and scn_baja_fecha is null

if @@error =0
begin
commit tran t1
end
else
begin

rollback tran t1
end

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
01/06/2005 - 17:32 | Informe spam
Eduardo,

Debes chequear el valor de @@error despues de cada sentencia.

Ejemplo:

begin transaction

update in_e1mov_aa set o_cuo_mov='0'

if @@error != 0 goto ErrorHandler

update in_e1mov_aa
set v_mov_cta= alt_id
from in_e1_alta_aut
where alt_tabla='cta' and alt_clave=o_cta_clave_mov

if @@error != 0 goto ErrorHandler

...

commit transaction

return @@error

ErrorHandler:

if @@trancount > 0 rollback transaction

return -1
go


AMB

"Eduardo De Luca" wrote:

Que tal , amigos . TEngo un problema que seguramente le estoy pifiando en el
codigo , tengo (en el codigo descrito abajo) programada un transaccion, y se
si produce un error en el update se vuelve para atras todo. El echo es que
produzo el error intencionalmete en un update pero igual me actualiza las
otras tablas.
Que estoy haciendo mal?

les paso el codigo



begin tran t1

update in_e1mov_aa set o_cuo_mov='0'
update in_e1mov_aa set v_mov_cta= alt_id from in_e1_alta_aut where
alt_tabla='cta' and alt_clave=o_cta_clave_mov
update in_e1mov_aa set v_mov_mon= mon_id from monedas where
rtrim(mon_nombre_corto)=rtrim(o_mon_mov) and mon_baja_fecha is null
update in_e1mov_aa set v_id_con_mov= con_id from conceptos where
rtrim(con_nombre_corto)=rtrim(o_con_mov) and con_baja_fecha is null
update in_e1mov_aa set v_id_scn_con= scn_id from sub_conceptos where
rtrim(scn_nombre_corto)=rtrim(o_scn_mov) and scn_baja_fecha is null

if @@error =0
begin
commit tran t1
end
else
begin

rollback tran t1
end



Respuesta Responder a este mensaje
#2 Eduardo De Luca
01/06/2005 - 17:52 | Informe spam
Alejandro , gracias . Pero te comento la sgte : el código que describí es
solo una parte de un sp, el mismo posee como 300 líneas , en cada sentencia
debo preguntar por el error ? es decir unas 300 veces ?



Corregime si estoy equivocado pero tenia el concepto de que una transacción
se podía componer de un conjunto de sentencias , es decir si una falla
vuelvo todo para atrás.

Gracias , nuevamente , aguardo tu respuesta


"Alejandro Mesa" escribió en el
mensaje news:
Eduardo,

Debes chequear el valor de @@error despues de cada sentencia.

Ejemplo:

begin transaction

update in_e1mov_aa set o_cuo_mov='0'

if @@error != 0 goto ErrorHandler

update in_e1mov_aa
set v_mov_cta= alt_id
from in_e1_alta_aut
where alt_tabla='cta' and alt_clave=o_cta_clave_mov

if @@error != 0 goto ErrorHandler

...

commit transaction

return @@error

ErrorHandler:

if @@trancount > 0 rollback transaction

return -1
go


AMB

"Eduardo De Luca" wrote:

Que tal , amigos . TEngo un problema que seguramente le estoy pifiando en
el
codigo , tengo (en el codigo descrito abajo) programada un transaccion, y
se
si produce un error en el update se vuelve para atras todo. El echo es
que
produzo el error intencionalmete en un update pero igual me actualiza
las
otras tablas.
Que estoy haciendo mal?

les paso el codigo



begin tran t1

update in_e1mov_aa set o_cuo_mov='0'
update in_e1mov_aa set v_mov_cta= alt_id from in_e1_alta_aut where
alt_tabla='cta' and alt_clave=o_cta_clave_mov
update in_e1mov_aa set v_mov_mon= mon_id from monedas where
rtrim(mon_nombre_corto)=rtrim(o_mon_mov) and mon_baja_fecha is null
update in_e1mov_aa set v_id_con_mov= con_id from conceptos where
rtrim(con_nombre_corto)=rtrim(o_con_mov) and con_baja_fecha is null
update in_e1mov_aa set v_id_scn_con= scn_id from sub_conceptos where
rtrim(scn_nombre_corto)=rtrim(o_scn_mov) and scn_baja_fecha is null

if @@error =0
begin
commit tran t1
end
else
begin

rollback tran t1
end



Respuesta Responder a este mensaje
#3 Alejandro Mesa
01/06/2005 - 17:56 | Informe spam
Eduardo,

Alejandro , gracias . Pero te comento la sgte : el código que describí es
solo una parte de un sp, el mismo posee como 300 líneas , en cada sentencia
debo preguntar por el error ? es decir unas 300 veces ?



Exactamente.

Corregime si estoy equivocado pero tenia el concepto de que una transacción
se podía componer de un conjunto de sentencias , es decir si una falla
vuelvo todo para atrás.



Estas en lo correcto. Como sabes si una sentencia fallo o tuvo exito?.
Fijate que el rollback y/o el commit de la transaccion se hace solo una vez.


AMB

"Eduardo De Luca" wrote:

Alejandro , gracias . Pero te comento la sgte : el código que describí es
solo una parte de un sp, el mismo posee como 300 líneas , en cada sentencia
debo preguntar por el error ? es decir unas 300 veces ?



Corregime si estoy equivocado pero tenia el concepto de que una transacción
se podía componer de un conjunto de sentencias , es decir si una falla
vuelvo todo para atrás.

Gracias , nuevamente , aguardo tu respuesta


"Alejandro Mesa" escribió en el
mensaje news:
> Eduardo,
>
> Debes chequear el valor de @@error despues de cada sentencia.
>
> Ejemplo:
>
> begin transaction
>
> update in_e1mov_aa set o_cuo_mov='0'
>
> if @@error != 0 goto ErrorHandler
>
> update in_e1mov_aa
> set v_mov_cta= alt_id
> from in_e1_alta_aut
> where alt_tabla='cta' and alt_clave=o_cta_clave_mov
>
> if @@error != 0 goto ErrorHandler
>
> ...
>
> commit transaction
>
> return @@error
>
> ErrorHandler:
>
> if @@trancount > 0 rollback transaction
>
> return -1
> go
>
>
> AMB
>
> "Eduardo De Luca" wrote:
>
>> Que tal , amigos . TEngo un problema que seguramente le estoy pifiando en
>> el
>> codigo , tengo (en el codigo descrito abajo) programada un transaccion, y
>> se
>> si produce un error en el update se vuelve para atras todo. El echo es
>> que
>> produzo el error intencionalmete en un update pero igual me actualiza
>> las
>> otras tablas.
>> Que estoy haciendo mal?
>>
>> les paso el codigo
>>
>>
>>
>> begin tran t1
>>
>> update in_e1mov_aa set o_cuo_mov='0'
>> update in_e1mov_aa set v_mov_cta= alt_id from in_e1_alta_aut where
>> alt_tabla='cta' and alt_clave=o_cta_clave_mov
>> update in_e1mov_aa set v_mov_mon= mon_id from monedas where
>> rtrim(mon_nombre_corto)=rtrim(o_mon_mov) and mon_baja_fecha is null
>> update in_e1mov_aa set v_id_con_mov= con_id from conceptos where
>> rtrim(con_nombre_corto)=rtrim(o_con_mov) and con_baja_fecha is null
>> update in_e1mov_aa set v_id_scn_con= scn_id from sub_conceptos where
>> rtrim(scn_nombre_corto)=rtrim(o_scn_mov) and scn_baja_fecha is null
>>
>> if @@error =0
>> begin
>> commit tran t1
>> end
>> else
>> begin
>>
>> rollback tran t1
>> end
>>
>>
>>



Respuesta Responder a este mensaje
#4 Eduardo De Luca
01/06/2005 - 18:10 | Informe spam
Alejandro : que te parece esto que recien probe y funciono

begin tran

codigo


commit tran


si se produce un error realiza el rollback y me tira un error , y no tengo
que estar preguntando en cada linea


"Alejandro Mesa" escribió en el
mensaje news:
Eduardo,

Alejandro , gracias . Pero te comento la sgte : el código que describí es
solo una parte de un sp, el mismo posee como 300 líneas , en cada
sentencia
debo preguntar por el error ? es decir unas 300 veces ?



Exactamente.

Corregime si estoy equivocado pero tenia el concepto de que una
transacción
se podía componer de un conjunto de sentencias , es decir si una falla
vuelvo todo para atrás.



Estas en lo correcto. Como sabes si una sentencia fallo o tuvo exito?.
Fijate que el rollback y/o el commit de la transaccion se hace solo una
vez.


AMB

"Eduardo De Luca" wrote:

Alejandro , gracias . Pero te comento la sgte : el código que describí es
solo una parte de un sp, el mismo posee como 300 líneas , en cada
sentencia
debo preguntar por el error ? es decir unas 300 veces ?



Corregime si estoy equivocado pero tenia el concepto de que una
transacción
se podía componer de un conjunto de sentencias , es decir si una falla
vuelvo todo para atrás.

Gracias , nuevamente , aguardo tu respuesta


"Alejandro Mesa" escribió en el
mensaje news:
> Eduardo,
>
> Debes chequear el valor de @@error despues de cada sentencia.
>
> Ejemplo:
>
> begin transaction
>
> update in_e1mov_aa set o_cuo_mov='0'
>
> if @@error != 0 goto ErrorHandler
>
> update in_e1mov_aa
> set v_mov_cta= alt_id
> from in_e1_alta_aut
> where alt_tabla='cta' and alt_clave=o_cta_clave_mov
>
> if @@error != 0 goto ErrorHandler
>
> ...
>
> commit transaction
>
> return @@error
>
> ErrorHandler:
>
> if @@trancount > 0 rollback transaction
>
> return -1
> go
>
>
> AMB
>
> "Eduardo De Luca" wrote:
>
>> Que tal , amigos . TEngo un problema que seguramente le estoy pifiando
>> en
>> el
>> codigo , tengo (en el codigo descrito abajo) programada un
>> transaccion, y
>> se
>> si produce un error en el update se vuelve para atras todo. El echo es
>> que
>> produzo el error intencionalmete en un update pero igual me actualiza
>> las
>> otras tablas.
>> Que estoy haciendo mal?
>>
>> les paso el codigo
>>
>>
>>
>> begin tran t1
>>
>> update in_e1mov_aa set o_cuo_mov='0'
>> update in_e1mov_aa set v_mov_cta= alt_id from in_e1_alta_aut where
>> alt_tabla='cta' and alt_clave=o_cta_clave_mov
>> update in_e1mov_aa set v_mov_mon= mon_id from monedas where
>> rtrim(mon_nombre_corto)=rtrim(o_mon_mov) and mon_baja_fecha is null
>> update in_e1mov_aa set v_id_con_mov= con_id from conceptos where
>> rtrim(con_nombre_corto)=rtrim(o_con_mov) and con_baja_fecha is null
>> update in_e1mov_aa set v_id_scn_con= scn_id from sub_conceptos where
>> rtrim(scn_nombre_corto)=rtrim(o_scn_mov) and scn_baja_fecha is null
>>
>> if @@error =0
>> begin
>> commit tran t1
>> end
>> else
>> begin
>>
>> rollback tran t1
>> end
>>
>>
>>



Respuesta Responder a este mensaje
#5 Alejandro Mesa
01/06/2005 - 18:30 | Informe spam
Eduardo,

Donde esta el rollback?

Si una sentencia falla, depende del error, sql server continuara con la
proxima sentencia y asi sucesivamente, por lo que llegara a la sentencia
commit y salvara los cambios aunque haya habido errores. Lo que buscamos es
que la transaccion dure lo menos posible, asi que si hay un error se debe
hacer un rollback (al menos que uses SET XACT_ABORT ON) y salir del
procedimiento. Como sabemos si hubo un error despues de cada sentencia?, pues
preguntando por el valor de @@error, cuyo valor se actualiza despues de cada
sentencia (guarda el # del error de la ultima sentencia ejecutada o valor 0
si esta tuvo exito). Quizas quieras enviar un error mas descriptivo hacia la
aplicacion cliente y para eso puedes usar RAISERROR.

use northwind
go

create procedure dbo.usp_p1
as
set nocount on

begin transaction

update [order details]
set discount = -1
where orderid = 10250

if @@error != 0 goto ErrorHandler

update [order details]
set quantity = quantity
where orderid = 10250

if @@error != 0 goto ErrorHandler

commit transaction

return @@error

ErrorHandler:

if @@trancount > 0
begin
rollback transaction
raiserror('hubo un error durante la actualizacion de la tabla [order
details].', 16, 1)
end

return -1
go

declare @rv int
declare @error int

exec @rv = dbo.usp_p1

set @error = coalesce(nullif(@rv, 0), @@error)

print @error
go

drop procedure dbo.usp_p1
go


AMB

"Eduardo De Luca" wrote:

Alejandro : que te parece esto que recien probe y funciono

begin tran

codigo


commit tran


si se produce un error realiza el rollback y me tira un error , y no tengo
que estar preguntando en cada linea


"Alejandro Mesa" escribió en el
mensaje news:
> Eduardo,
>
>> Alejandro , gracias . Pero te comento la sgte : el código que describí es
>> solo una parte de un sp, el mismo posee como 300 líneas , en cada
>> sentencia
>> debo preguntar por el error ? es decir unas 300 veces ?
>
> Exactamente.
>
>> Corregime si estoy equivocado pero tenia el concepto de que una
>> transacción
>> se podía componer de un conjunto de sentencias , es decir si una falla
>> vuelvo todo para atrás.
>
> Estas en lo correcto. Como sabes si una sentencia fallo o tuvo exito?.
> Fijate que el rollback y/o el commit de la transaccion se hace solo una
> vez.
>
>
> AMB
>
> "Eduardo De Luca" wrote:
>
>> Alejandro , gracias . Pero te comento la sgte : el código que describí es
>> solo una parte de un sp, el mismo posee como 300 líneas , en cada
>> sentencia
>> debo preguntar por el error ? es decir unas 300 veces ?
>>
>>
>>
>> Corregime si estoy equivocado pero tenia el concepto de que una
>> transacción
>> se podía componer de un conjunto de sentencias , es decir si una falla
>> vuelvo todo para atrás.
>>
>> Gracias , nuevamente , aguardo tu respuesta
>>
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> > Eduardo,
>> >
>> > Debes chequear el valor de @@error despues de cada sentencia.
>> >
>> > Ejemplo:
>> >
>> > begin transaction
>> >
>> > update in_e1mov_aa set o_cuo_mov='0'
>> >
>> > if @@error != 0 goto ErrorHandler
>> >
>> > update in_e1mov_aa
>> > set v_mov_cta= alt_id
>> > from in_e1_alta_aut
>> > where alt_tabla='cta' and alt_clave=o_cta_clave_mov
>> >
>> > if @@error != 0 goto ErrorHandler
>> >
>> > ...
>> >
>> > commit transaction
>> >
>> > return @@error
>> >
>> > ErrorHandler:
>> >
>> > if @@trancount > 0 rollback transaction
>> >
>> > return -1
>> > go
>> >
>> >
>> > AMB
>> >
>> > "Eduardo De Luca" wrote:
>> >
>> >> Que tal , amigos . TEngo un problema que seguramente le estoy pifiando
>> >> en
>> >> el
>> >> codigo , tengo (en el codigo descrito abajo) programada un
>> >> transaccion, y
>> >> se
>> >> si produce un error en el update se vuelve para atras todo. El echo es
>> >> que
>> >> produzo el error intencionalmete en un update pero igual me actualiza
>> >> las
>> >> otras tablas.
>> >> Que estoy haciendo mal?
>> >>
>> >> les paso el codigo
>> >>
>> >>
>> >>
>> >> begin tran t1
>> >>
>> >> update in_e1mov_aa set o_cuo_mov='0'
>> >> update in_e1mov_aa set v_mov_cta= alt_id from in_e1_alta_aut where
>> >> alt_tabla='cta' and alt_clave=o_cta_clave_mov
>> >> update in_e1mov_aa set v_mov_mon= mon_id from monedas where
>> >> rtrim(mon_nombre_corto)=rtrim(o_mon_mov) and mon_baja_fecha is null
>> >> update in_e1mov_aa set v_id_con_mov= con_id from conceptos where
>> >> rtrim(con_nombre_corto)=rtrim(o_con_mov) and con_baja_fecha is null
>> >> update in_e1mov_aa set v_id_scn_con= scn_id from sub_conceptos where
>> >> rtrim(scn_nombre_corto)=rtrim(o_scn_mov) and scn_baja_fecha is null
>> >>
>> >> if @@error =0
>> >> begin
>> >> commit tran t1
>> >> end
>> >> else
>> >> begin
>> >>
>> >> rollback tran t1
>> >> end
>> >>
>> >>
>> >>
>>
>>
>>



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