Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/08/2011, 12:17
ocp001a
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Bloqueo de tabla, transacciones o ambas?

Hola.

Hasta hoy he realizado muchos proyectos principalmente de tipo consulta o como mucho administración (alta, baja modificación) de usuarios y cosas sencillas por lo que usar BD tipo MyISAM me era suficiente.

pero ahora tengo un proyecto un tanto delicado (manejo de dinero) y he comenzado a manejar Innodb y a documentarme en transacciones.

Mi situación es la siguiente:

Teniendo una cuenta con x cantidad de dinero disponible, varios usuarios (entre 30 y 50 por lo menos) tomarán parte de ese dinero para comprar, por lo cual antes de hacer la compra debo verificar si hay suficiente dinero disponible en la cuenta. La concurrencia será pan de cada día.


En los manuales que he leído sobre transacciones siempre veo el ejemplo de una transferencia de dinero de A a B:
Si se completa quitar dinero a A,
Suma dinero a B,
si se completan ambas ejecuta.

Pero no he encontrado (seguramente he buscado mal) ejemplos concretos para mi caso.

Mi duda concreta es la siguiente:

Usar transacciones tipo:

Código PHP:
Ver original
  1. mysql_query("BEGIN");
  2. if(($dinero=mysql_result(mysql_query("select disponible from cuentas where cuenta=$id"),0))>$cantidad){
  3.        ///si hay más dinero disponible que la cantidad requerida realiza la operacion de compra
  4.        //me conecto a un Web Service con otro sistema
  5.       if(mysql_query("update cuentas set disponible=(disponible-$cantidad) where id=$id")){
  6.              mysql_query("COMMIT");
  7.              echo "Compra realizada";
  8.       }
  9.        else{
  10.              mysql_query("ROLLBACK");
  11.              echo "No fue posible realizar la compra";
  12.       }
  13. }else
  14.       echo "No hay dinero suficiente";

¿Ésta forma es efectiva? ¿O es posible (como me figuro) que antes de hacer el update otro usuario lo haga?


Otra cosa que he pensado es hacer toda la operación en una sola sentencia tipo:

Código PHP:
Ver original
  1. mysql_query("IF (select (disponible from cuentas where id=$id)>$cantidad) THEN update cuentas set disponible=(disponible-$cantidad)");
  2. //realizar la operación de compra por Web Service con otro sistema, si es exitosa termino, si no, devuelvo a la cuenta el dinero
O bien si definitivamente necesito bloquear completamente la tabla para realizar la operación.




Les agradezco su atención.