Transacciones MySQL con Doctrine y Symfony

noviembre 22, 2010

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).

Tags ; , , , ,

1 comentario

    McCubo Feb 01, 2013

    Muchas gracias, justo lo que necesitaba.!
    Gracias por compartir!!!

    Responder

Escribe un comentario

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.