Транзакції
Транзакції гарантують, що або всі операції в межах транзакції будуть виконані успішно, або жодна з них не буде виконана взагалі. Вони необхідні для підтримки узгодженості даних під час більш складних операцій.
Найпростіший спосіб використання транзакцій виглядає так:
$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()
. Цей метод приймає зворотний
виклик як параметр, який виконується всередині транзакції. Якщо
зворотний виклик виконується без генерування виключення, транзакція
автоматично фіксується. Якщо виняток буде згенеровано, транзакцію
буде відкочено, а виняток буде поширено далі.
$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(); // повертає кількість оновлених рядків
});