Ver Mensaje Individual
  #8 (permalink)  
Antiguo 14/12/2007, 15:57
Avatar de xcars
xcars
 
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 19 años
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.