Transacciones

Las transacciones garantizan que, o bien todas las operaciones de la transacción se ejecutan correctamente, o bien no se ejecuta ninguna. Son esenciales para mantener la coherencia de los datos durante operaciones más complejas.

La forma más sencilla de utilizar las transacciones es la siguiente:

$database->beginTransaction();
try {
	$database->query('DELETE FROM articles WHERE id = ?', $id);
	$database->query('INSERT INTO audit_log', [
		'article_id' => $id,
		'action' => 'delete'
	]);
	$database->commit();
} catch (\Exception $e) {
	$database->rollBack();
	throw $e;
}

Una forma mucho más limpia y elegante de conseguir el mismo resultado es utilizando el método transaction(). Este método acepta una llamada de retorno como parámetro, que ejecuta dentro de la transacción. Si la llamada de retorno se ejecuta sin lanzar una excepción, la transacción es automáticamente confirmada. Si se lanza una excepción, la transacción se revierte, y la excepción se propaga más allá.

$database->transaction(function ($database) use ($id) {
	$database->query('DELETE FROM articles WHERE id = ?', $id);
	$database->query('INSERT INTO audit_log', [
		'article_id' => $id,
		'action' => 'delete'
	]);
});

El método transaction() también puede devolver valores:

$count = $database->transaction(function ($database) {
	$result = $database->query('UPDATE users SET active = ?', true);
	return $result->getRowCount(); // devuelve el número de filas actualizadas
});
versión: 4.0