Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/12/2007, 10:24
albertoshu
 
Fecha de Ingreso: agosto-2007
Mensajes: 237
Antigüedad: 16 años, 9 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.