PDA

Ver la Versión Completa : Transacciones y Foreign Key


gluglu
02-02-2007, 18:45:12
Al parecer se me ha presentado ahora mismo un caso que me gustaría alguien del foro me pudiera confirmar por favor si es así o no.

Tengo dos transacciones distintas, con dos tablas, una por cada transacción, y estas tablas están relacionadas mediante una 'Foreign Key'.

Si hago un append en la primera, sin hacer un commit de la transacción, no me permite hacer un append en la segunda tabla con su correspondiente clave relacionada, ya que me lanza error de violación de clave Foreign Key.

Me obliga por tanto a hacer primero un commit de la primer transacción, o en el caso que no pretendería según mi planteamiento, tener que utilizar una única transacción ?

Muchas gracias por vuestras aclaraciones.

maeyanes
02-02-2007, 18:51:12
Yo cuando me encuentro en tu caso, uso una sola transacción para ambas tablas...



Saludos...

gluglu
02-02-2007, 18:57:47
Si, si ...

Si lo tengo claro que con una única transacción funciona. Lo que pasa que por el planteamiento que pretendo, necesitaría usar dos transacciones diferentes.

Mi caso es así :

1. Quiero crear un registro en la tabla 1.
2. Entonces se abre un nuevo form y en él se pueden realizar varias operaciones sobre una o más tablas que están relacionadas mediante la susodicha 'Foreign Key' con la tabla 1.

A. Si el usuario pulsar cancelar en el nuevo form, quiero hacer un Rollback de la transacción que en principio quiero tratar en el form 2.
B. Si el usuario pulsar aceptar en el nuevo form, salgo del form sin necesidad de realizar un commit.

De vuelta al formulario principal, si el usario Cancela, hago un rollbak de la transacción 1 y de la 2. Si el usuario Acepta, hago un commit de ambas transacciones.

Quiero añadir que por otro lado, a la transacción 1 están asociadas otras tablas diferentes que en este caso no vienen a cuestión. Si hicera un rollback de la transacción 1, evidentemente pretendería cancelar todos los cambios de todas las tablas asociadas a dicha transacción.

Es por ello que en principio pretendería utilizar 2 transacciones diferentes.

xavinet
02-02-2007, 19:44:27
Hola gluglu!

A mi entender las transacciones encapsulan todo aquello que tiene que hacerse para una acción determinada. Con lo cual es aconsejable que si lo que haces en forms hijos depende de lo que decidas en el padre pos se haga todo en una transacción.

La otra opción es que cuando crees el hijo commites el padre y si te cancelan el hijo vayas y tires los cambios atrás, pero esto no creo que sea muy viable ni aconsejable según los datos que trates.

Así que si estabas indeciso aquí estoy yo para sembrar más confusión :D

Suerte!

gluglu
02-02-2007, 20:04:02
Gracias por responder.

La cuestión como deshacer los cambios del padre después de haber hecho un commit del mismo !!??

Propuesta a los señores de CodeGear ;) ! Transacciones anidadas ! Transacción Padre y Transacción Hija !

Si realizo un commit del padre, también se realiza un commit del hijo, pudiendo realizar independientemente un commit del hijo.

Si Rollback del padre, rollback también del hijo independientemente de que se hubiera podido hacer un commit previo del hijo.

:o

xavinet
03-02-2007, 16:53:00
Hola gluglu!

Ya existen las transacciones anidas ... aquí por ejemplo en MS SQL Server

http://sql.manivesa.com/Tutoriales+SQL/Procedimientos+Almacenados/551.aspx

http://sql.manivesa.com/Tutoriales+SQL/Procedimientos+Almacenados/562.aspx

y aquí un poco de teoria de transacciones...

http://www.cs.cinvestav.mx/SC/prof_personal/adiaz/Disdb/Cap_5.html

...aquí tienes faena por si no sabes que hacer esta noche...:D

suerte!

gluglu
03-02-2007, 19:15:50
... yo uso Interbase 7.5 :(