Транзакции

Транзакциите гарантират, че или всички операции в рамките на транзакцията се изпълняват успешно, или не се изпълняват изобщо. Те са от съществено значение за поддържане на последователността на данните при по-сложни операции.

Най-простият начин за използване на транзакциите изглежда по следния начин:

$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