Транзакции

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

Простейший способ использования транзакций выглядит следующим образом:

$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