Transakcje
Transakcje gwarantują, że albo wszystkie operacje w ramach transakcji zostaną wykonane pomyślnie, albo żadna z nich nie zostanie wykonana. Są one niezbędne do utrzymania spójności danych podczas bardziej złożonych operacji.
Najprostszy sposób korzystania z transakcji wygląda następująco:
$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;
}
Znacznie czystszym i bardziej eleganckim sposobem osiągnięcia tego samego rezultatu jest użycie metody
transaction()
. Metoda ta przyjmuje jako parametr wywołanie zwrotne, które jest wykonywane w ramach transakcji.
Jeśli wywołanie zwrotne zostanie wykonane bez rzucenia wyjątku, transakcja zostanie automatycznie zatwierdzona. Jeśli zostanie
rzucony wyjątek, transakcja jest wycofywana, a wyjątek jest propagowany dalej.
$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'
]);
});
Metoda transaction()
może również zwracać wartości:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // zwraca liczbę zaktualizowanych wierszy
});