Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Estas en el tema de ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada? en el foro de Mysql en Foros del Web. Hola a todos, Una dudilla sobre transacciones. Tengo el siguiente codigo: Código PHP: 1 :  BEGIN ; 2 :  INSERT en bbdd ;  Si falla ROLLBACK ; 3. otro_acceso_a_la_bbdd (); ...
  #1 (permalink)  
Antiguo 13/12/2007, 05:59
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 1
¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Hola a todos,

Una dudilla sobre transacciones. Tengo el siguiente codigo:


Código PHP:
1BEGIN;
2INSERT en bbddSi falla ROLLBACK;
3. otro_acceso_a_la_bbdd();
4COMMIT;

5: function otro_acceso_a_la_bbdd(){
6:   INSERT en bbdd;Si falla ROLLBACK;
7: } 

Si se ejecuta el insert de la linea 2, entonces obligatoriametne se tiene que ejecutar el insert de la linea 6 y por eso incluyo estos dos insert dentro de la transacción delimintada por la lines 1 y 4.

El tema es que la funcion otro_acceso_a_la_bbdd() también puede ser invocada desde otra parte del código y, posiblemente, sin estar dentro de una transaccion. En tal caso, si fallara el insert de la linea 6 se ejecutaría un Rollback sin que se hubiera iniciado ninguna transaccion....

Hay algún problema por esto?

Un saludo a todos y gracias por adelantado.
  #2 (permalink)  
Antiguo 13/12/2007, 17:32
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Pues yo no lo haria asi, para mi la transaccion inicia antes de invocar la funcion, y la funcion me debe devolver 0 si se hizo bien 1 si hubo error
luego de invocar la funcion checo el resultado si es 0 commit de lo contrario rollback.
Espero te sirva

Cita:
Iniciado por albertoshu Ver Mensaje
Hola a todos,

Una dudilla sobre transacciones. Tengo el siguiente codigo:


Código PHP:
1BEGIN;
2INSERT en bbddSi falla ROLLBACK;
3. otro_acceso_a_la_bbdd();
4COMMIT;

5: function otro_acceso_a_la_bbdd(){
6:   INSERT en bbdd;Si falla ROLLBACK;
7: } 

Si se ejecuta el insert de la linea 2, entonces obligatoriametne se tiene que ejecutar el insert de la linea 6 y por eso incluyo estos dos insert dentro de la transacción delimintada por la lines 1 y 4.

El tema es que la funcion otro_acceso_a_la_bbdd() también puede ser invocada desde otra parte del código y, posiblemente, sin estar dentro de una transaccion. En tal caso, si fallara el insert de la linea 6 se ejecutaría un Rollback sin que se hubiera iniciado ninguna transaccion....

Hay algún problema por esto?

Un saludo a todos y gracias por adelantado.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #3 (permalink)  
Antiguo 14/12/2007, 02:18
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 1
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Muchas gracias por tu respuesta Xcars.

Entiendo que lo que propones son dos transaccones anidadadas, pero...Mysql admite transacciones anidadas?

Un saludo.
  #4 (permalink)  
Antiguo 14/12/2007, 04:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

No. MySQL no soporta todavía transacciones anidadas, por lo que tenés que planear muy bien la secuencia de la transacción.
Además ten en cuenta que transacciones muy largas pueden producir bloqueos encadenados si están en un sistema distribuido, los que tienen efecto calamitoso en la performace de la base.
  #5 (permalink)  
Antiguo 14/12/2007, 06:24
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 1
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Muchas gracias por tu respuesta Gnzsoloyo. Debe ser por eso que no encontraba nada en internet acerca de transacciones anidadadas con mysql.

Por lo que me dices hay que hacer un uso muy restritivo de las transacciones, pero, en el caso de que esté obligado a hacer una transaccion....y teniendo en cuenta el ejemplo que puse al principio del post...

hay alguna manera de saber si hay una transacciones activa? o, volviendo a la pregunta inicial...¿Que pasa si hago un Rollback sin que haya una transaccion activa?

Un saludo y muchas gracias otra vez.
  #6 (permalink)  
Antiguo 14/12/2007, 09:09
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Que version de Mysql estas usando? porque podrias usar procedimientos almacenados....
Yo creo que lo mejor que puedes hacer es explicar que pretendes hacer, muchas veces le buscamos soluciones a problemas erroneos

Cita:
Iniciado por albertoshu Ver Mensaje
Muchas gracias por tu respuesta Gnzsoloyo. Debe ser por eso que no encontraba nada en internet acerca de transacciones anidadadas con mysql.

Por lo que me dices hay que hacer un uso muy restritivo de las transacciones, pero, en el caso de que esté obligado a hacer una transaccion....y teniendo en cuenta el ejemplo que puse al principio del post...

hay alguna manera de saber si hay una transacciones activa? o, volviendo a la pregunta inicial...¿Que pasa si hago un Rollback sin que haya una transaccion activa?

Un saludo y muchas gracias otra vez.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #7 (permalink)  
Antiguo 14/12/2007, 10:24
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 1
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Cita:
Iniciado por xcars Ver Mensaje
Que version de Mysql estas usando? porque podrias usar procedimientos almacenados....
Yo creo que lo mejor que puedes hacer es explicar que pretendes hacer, muchas veces le buscamos soluciones a problemas erroneos

Tienes razón. Quizá me esté metiendo en un "fregao".

Ahi vá uno de los caso más claros:

Tengo una tabla en la que almaceno eventos que son de interés para una lista de usuarios. Cuando inserto un evento nuevo, mando un email a cada uno de los miembros de la lista. Para hacer esto tengo las siguientes tablas ligadas mediante claves foraneas:

eventos(id_evento,id_lista)
listas_usuarios(id_lista,id_usuario)
notificaciones (id_evento,id_usuario)

Así pues cuando inserto una nuevo evento se ejecuta el siguiente código:

Código PHP:
1$id_evento=1;
2$id_lista=2;

3BEGIN transaccion;

4INSERT INTO eventos(id_evento,id_listavalues($id_evento,$id_lista);
5$lista_de_usuarios=SELECT FROM listas_usuario WHERE id_lista=$id_lista;

6enviar_notificaciones($lista_de_usuarios);

7COMMIT transaccion;

8: function enviar_notificaciones($lista_de_usuarios){
9:     Para cada item de  $lista_de_usuarios{
10:         INSERT INTO notificaciones ($id_evento,$id_usuario); (ROLLBACK)
11:         enviar_email($id_evento,$id_usuario);
12:         }
13:} 
Si no hubiese un ROLLBACK en la funcion enviar_notificaciones(), podrian existir eventos que no habrían sido notificados.

Por otra parte, y por diversos motivos, puede haber notificaciones que no tengan un evento asociado, por lo que la función enviar_notificaciones() podría ejecutarse fuera de una transaccion sin que fuera importante si el INSERT que contiene fallase. Pero si fallase en este caso, haría un ROLLBACK sin que hubiera habido un BEGIN.

...Y esta es la razón por la que pregunto qué pasa si hay un rollback sin que haya una transaccion activa.
  #8 (permalink)  
Antiguo 14/12/2007, 15:57
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

ok esta un poquito mas claro.
porque haces un rollback aqui? o porque lo tendrias que hacer?

Código:
8: function enviar_notificaciones($lista_de_usuarios){
9:     Para cada item de  $lista_de_usuarios{
10:         INSERT INTO notificaciones ($id_evento,$id_usuario); (ROLLBACK)
11:         enviar_email($id_evento,$id_usuario);
pues mira, analizando lo que dices, creo que segun lo tienes diagramado, no deberias de permitir notifiaciones sin eventos, podrias tener algun evento (No aplica, N/A) para hacer notificaciones sin un evento.
Por otro lado, yo lo intentaria hacer con triggers y/o procedimientos almacenados porque tdoas las acciones se generan de los inserts... mas que dejarselo todo a php....
Ahora bien, no veo el sentido de tu transaccion, ya que le estas diciendo que si hubo un fallo cancele el proceso, eso significa que paras todo, todoos los inserts efectivos que hubieron los cancelas, entonces yo mas creo que lo primero es generar la lista de emails a quienes se les puede enviar una notificacion (no importando si viene de un evento o no, o con el evento como te comente antes) y luego hacer la entrega de las notificaciones, que significa esto, que no necesitarias las transacciones. Creo que en tu caso, yo, no ocuparia...
CLARO, A MENOS QUE NO HALLA ENTENDIDO BIEN LO QUE ESTAS HACIENDO JAJAJA

Cita:
Iniciado por albertoshu Ver Mensaje
Tienes razón. Quizá me esté metiendo en un "fregao".

Ahi vá uno de los caso más claros:

Tengo una tabla en la que almaceno eventos que son de interés para una lista de usuarios. Cuando inserto un evento nuevo, mando un email a cada uno de los miembros de la lista. Para hacer esto tengo las siguientes tablas ligadas mediante claves foraneas:

eventos(id_evento,id_lista)
listas_usuarios(id_lista,id_usuario)
notificaciones (id_evento,id_usuario)

Así pues cuando inserto una nuevo evento se ejecuta el siguiente código:

Código PHP:
1$id_evento=1;
2$id_lista=2;

3BEGIN transaccion;

4INSERT INTO eventos(id_evento,id_listavalues($id_evento,$id_lista);
5$lista_de_usuarios=SELECT FROM listas_usuario WHERE id_lista=$id_lista;

6enviar_notificaciones($lista_de_usuarios);

7COMMIT transaccion;

8: function enviar_notificaciones($lista_de_usuarios){
9:     Para cada item de  $lista_de_usuarios{
10:         INSERT INTO notificaciones ($id_evento,$id_usuario); (ROLLBACK)
11:         enviar_email($id_evento,$id_usuario);
12:         }
13:} 
Si no hubiese un ROLLBACK en la funcion enviar_notificaciones(), podrian existir eventos que no habrían sido notificados.

Por otra parte, y por diversos motivos, puede haber notificaciones que no tengan un evento asociado, por lo que la función enviar_notificaciones() podría ejecutarse fuera de una transaccion sin que fuera importante si el INSERT que contiene fallase. Pero si fallase en este caso, haría un ROLLBACK sin que hubiera habido un BEGIN.

...Y esta es la razón por la que pregunto qué pasa si hay un rollback sin que haya una transaccion activa.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #9 (permalink)  
Antiguo 17/12/2007, 02:53
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 1
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Hola Xcars,

Las notificacioens requieren el id_evento por lo que primero debería hacer los inserte en la tabla eventos para saber su id y luego en la tabla notificaciones.

En todos caso, creo que tienes razón y lo mejor será intentar implementarlo con triggers.

Un saludos y muchas graicias por tu ayuda.
  #10 (permalink)  
Antiguo 17/12/2007, 11:11
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

ok, solo como aclaracion, en los SP (stored procedures) pues usar transacciones tambien :) la diferencia es la forma en que lo estructuras y dejas todo en manos del motor de la base de datos.
En tu caso yo utilizaria Triggers y SP.
Saludos

Cita:
Iniciado por albertoshu Ver Mensaje
Hola Xcars,

Las notificacioens requieren el id_evento por lo que primero debería hacer los inserte en la tabla eventos para saber su id y luego en la tabla notificaciones.

En todos caso, creo que tienes razón y lo mejor será intentar implementarlo con triggers.

Un saludos y muchas graicias por tu ayuda.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #11 (permalink)  
Antiguo 17/12/2007, 11:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

Para definir qué usar, si trigger o SP, mira bien lo siguiente:
- Si los datos llegan en el insert a una sola tabla, usa un trigger. Asi ni siquiera tendrás que verificar si lo hace. Lo hara SIEMPRE.
- Si los datos entran desde dos o más tablas, o por medio de variables que no se almacenarán, o tienen condiciones, y afectan una o más tablas, usa SP. Incluso puedes usar transacciones DENTRO del SP.
  #12 (permalink)  
Antiguo 17/12/2007, 11:29
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 1
Re: ¿Qué pasa si ejecuto un ROLLBACK sin que haya ninguna transaccion iniciada?

ok, a ver que tal.

Muchas gracias a los dos.

Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:04.