Транзакції

Транзакції гарантують, що або всі операції в межах транзакції будуть виконані успішно, або жодна з них не буде виконана взагалі. Вони необхідні для підтримки узгодженості даних під час більш складних операцій.

Найпростіший спосіб використання транзакцій виглядає так:

$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(); // повертає кількість оновлених рядків
});
версію: 4.0