Transacciones MySQL con Doctrine y Symfony
Lo primero de todo, ¿qué es una transacción MySQL? Una transacción en MySQL es la combinación de una o más consultas SQL que juntas forman una unidad de trabajo. El ejemplo clásico es el movimiento de dinero en un banco entre dos cuentas bancarias. Si la persona A quiere hacer una transferencia bancaria a la persona B, habrá dos consultas: 1) la que descuenta el dinero a la persona A y 2) la que aumenta el saldo de la persona B. Si falla la consulta 2, tenemos un problema: Le habremos descontado el dinero a la persona A pero la persona B nunca recibirá su dinero.
En casos como estos es necesario tomar estas dos consultas como un todo y si falla una de las dos operaciones, volver atrás y deshacer la operación. Para ello se utilizan las transacciones.
En este ejemplo vamos a ver como realizar transacciones con el ORM Doctrine y Symfony (no necesariamente debemos utilizar Symfony).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $conn = Doctrine_Manager::getInstance()->getCurrentConnection(); $conn->beginTransaction(); try{ /** Hacemos las operaciones necesarias * para realizar la transferencia bancaria */ $userA = UserTable::getById($userA_id); $userB = UserTable::getById($userB_id); $userA->money -= 20; $userA->save(); $userB->money += 20; $userB->save(); $conn->commit(); } catch (Exception $e){ $conn->rollBack(); throw $e; } |
Si las dos operaciones se realizan con éxito, quedará reflejado en la base de datos. Si por el contrario cualquiera de las dos consultas fallará, se desharán los cambios (rollBack) y no se guardarán en la base de datos (mostramos el error y deberemos tratarlo según nuestros intereses).
Muchas gracias, justo lo que necesitaba.!
Gracias por compartir!!!