Транзакції
Транзакції гарантують, що або всі операції в рамках транзакції будуть виконані, або жодна з них. Вони корисні для забезпечення узгодженості даних під час складних операцій.
Найпростіший спосіб використання транзакцій виглядає так:
$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;
}
Набагато елегантніше те саме можна записати за допомогою методу
transaction()
. Він приймає як параметр callback, який виконується в
транзакції. Якщо callback завершується без винятку, транзакція
автоматично підтверджується. Якщо виникає виняток, транзакція
скасовується (rollback), а виняток поширюється далі.
$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'
]);
});
Метод transaction()
також може повертати значення:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // повертає кількість оновлених рядків
});