Transacciones en SQL Server 2000

07/05/2009 - 23:47 por Saga | Informe spam
Saludos, tengo un problema que no he encontrado como resolverlo de la forma
mas eficiente. Comparto esta información aquí, esperando alguien me puede
orientar.



Se usan transacciones, con VB6, ADO 2.7 y SQL Server 2000.



Se tiene una lista de elementos donde cada elemento describe un producto que
se necesita entregar a un destinatario. Por razones internas algunos de los
productos se dividen en "sub-productos" donde cada sub-producto se debe
considerar como si fuera un producto por separado. El numero máximo de
sub-productos es 35, el cal de vez en cuando se llega. Todos los datos de
todos los sub-productos se deben guardar correctamente, sino no se debe
guardar ninguno. La información de cada producto se guarda en 4 tablas:
Consolidación, Embarques, SueltoCab y SueltoDet. Normalmente el producto es
tal que solo es necesario guardarlo en Consolidación y Embarque. Es solo
cuando el producto consiste de piezas sueltas que es necesario documentarlo
en las tablas SueltosCab (Cabecera) y SueltosDet (Detalle). En todo caso,
cuando los datos se insertan en estas tablas (sean en las 2 o 4) es
necesario garantizar que se hayan escrito los datos correctamente a todas
las tablas. Si hay un error entonces se debe cancelar la inserción.



Actualmente se esta armando una secuencia de SQL y esta se envía al servidor
SQL Server. La secuencia es similar a esta:



Begin trans



Delete from Embarques where Campo=x

If @@error = 0

Insert into Embarques (Campos) values (datos)

If @@Error = 0

Delete from Consolidacion where Campo=x

If @@Error = 0

Insert into Consolidacion (Campos) values (datos)

If @@Error = 0

Commit Trans

Else

Rollback Trans

Else

Rollback Trans

Else

Rollback Trans

Else

Rollback trans



Mi pregunta es si esta es la mejor estrategia para realizar este proceso.
Gracias, Saga
 

Leer las respuestas

#1 Carlos Sacristan
08/05/2009 - 08:48 | Informe spam
Un poco enrevesado.

Yo probablemente optaría por la estrategia contraria y usar etiquetas, es
decir:

Delete from Embarques where Campo=x
If @@error <> 0
GOTO mal
Insert into Embarques (Campos) values (datos)
If @@error <> 0
GOTO mal
Delete from Consolidacion where Campo=x
If @@error <> 0
GOTO mal
Insert into Consolidacion (Campos) values (datos)
If @@error <> 0
GOTO mal

ok:
COMMIT TRAN
RETURN 0

mal:
ROLLBACK TRAN
RETURN -1

Un saludo
-
www.navento.com
Servicios de Localización GPS

http://blogs.solidq.com/ES/ElRincon...fault.aspx

"Saga" escribió en el mensaje
news:
Saludos, tengo un problema que no he encontrado como resolverlo de la
forma mas eficiente. Comparto esta información aquí, esperando alguien me
puede orientar.



Se usan transacciones, con VB6, ADO 2.7 y SQL Server 2000.



Se tiene una lista de elementos donde cada elemento describe un producto
que se necesita entregar a un destinatario. Por razones internas algunos
de los productos se dividen en "sub-productos" donde cada sub-producto se
debe considerar como si fuera un producto por separado. El numero máximo
de sub-productos es 35, el cal de vez en cuando se llega. Todos los datos
de todos los sub-productos se deben guardar correctamente, sino no se debe
guardar ninguno. La información de cada producto se guarda en 4 tablas:
Consolidación, Embarques, SueltoCab y SueltoDet. Normalmente el producto
es tal que solo es necesario guardarlo en Consolidación y Embarque. Es
solo cuando el producto consiste de piezas sueltas que es necesario
documentarlo en las tablas SueltosCab (Cabecera) y SueltosDet (Detalle).
En todo caso, cuando los datos se insertan en estas tablas (sean en las 2
o 4) es necesario garantizar que se hayan escrito los datos correctamente
a todas las tablas. Si hay un error entonces se debe cancelar la
inserción.



Actualmente se esta armando una secuencia de SQL y esta se envía al
servidor SQL Server. La secuencia es similar a esta:



Begin trans



Delete from Embarques where Campo=x

If @@error = 0

Insert into Embarques (Campos) values (datos)

If @@Error = 0

Delete from Consolidacion where Campo=x

If @@Error = 0

Insert into Consolidacion (Campos) values (datos)

If @@Error = 0

Commit Trans

Else

Rollback Trans

Else

Rollback Trans

Else

Rollback Trans

Else

Rollback trans



Mi pregunta es si esta es la mejor estrategia para realizar este proceso.
Gracias, Saga




Preguntas similares