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
if(($dinero=mysql_result(mysql_query("select disponible from cuentas where cuenta=$id"),0))>$cantidad){ ///si hay más dinero disponible que la cantidad requerida realiza la operacion de compra //me conecto a un Web Service con otro sistema echo "Compra realizada"; } else{ echo "No fue posible realizar la compra"; } }else 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:
O bien si definitivamente necesito bloquear completamente la tabla para realizar la operación.Ver original
mysql_query("IF (select (disponible from cuentas where id=$id)>$cantidad) THEN update cuentas set disponible=(disponible-$cantidad)"); //realizar la operación de compra por Web Service con otro sistema, si es exitosa termino, si no, devuelvo a la cuenta el dinero
Les agradezco su atención.