lunes, 1 de junio de 2015

Trabajando con transacciones

Hay dos formas de utilizar las transacciones mientras se trabaja con Active Record.

La primera forma es encerrar explícitamente las llamadas a los métodos de Active Record en un bloque transaccional, como se muestra a continuación:

$cliente Cliente::findOne(123);

Cliente::getDb()->transaction(function($db) use ($cliente) {
    $cliente->id 200;
    $cliente->save();
    // ...otras operaciones BD ...
});

// o alternativamente

$transaction Cliente::getDb()->beginTransaction();
try {
    $cliente->id 200;
    $cliente->save();
    // ...otras operaciones BD ...
    $transaction->commit();
} catch(\Exception $e) {
    $transaction->rollBack();
    throw $e;
}

La segunda manera es hacer una lista de las operaciones de base de datos que requieren soporte transaccional en el método yii\db\ActiveRecord::transactions(). Por ejemplo:

class Cliente extends ActiveRecord
{
    public function transactions()
    {
        return [
            'admin' => self::OP_INSERT,
            'api' => self::OP_INSERT self::OP_UPDATE self::OP_DELETE,
            // lo anterior es equivalente a:
            // 'api' => self::OP_ALL,
        ];
    }
}

El método yii\db\ActiveRecord::transactions() debe devolver una matriz cuyas claves son los nombres de los escenarios y los valores correspondientes a las operaciones que deberían ser encapsuladas dentro de las transacciones. Se debe utilizar las siguientes constantes para referirse a las operaciones de base de datos:

  • OP_INSERT : operación de inserción realizado por: insert() ;
  • OP_UPDATE : operación de actualización realizada por: update() ;
  • OP_DELETE : operación de eliminación realizada por delete() .

Hay que utilizar el símbolo de barra vertical ( | ) para concatenar más de una operación. También se puede utilizar OP_ALL para referirse a las tres operaciones.


También te puede interesar:
Consulta de Datos
Almacenamiento de Datos
Active Record (Registro Activo)