Tranzacții

Tranzacțiile garantează fie că toate operațiile din cadrul tranzacției sunt executate cu succes, fie că niciuna nu este executată deloc. Acestea sunt esențiale pentru menținerea coerenței datelor în timpul operațiunilor mai complexe.

Cel mai simplu mod de a utiliza tranzacțiile arată astfel:

$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;
}

Un mod mult mai curat și mai elegant de a obține același rezultat este utilizarea metodei transaction(). Această metodă acceptă un callback ca parametru, pe care îl execută în cadrul tranzacției. Dacă callback-ul se execută fără a genera o excepție, tranzacția este confirmată automat. Dacă se aruncă o excepție, tranzacția este reluată, iar excepția este propagată mai departe.

$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'
	]);
});

Metoda transaction() poate, de asemenea, să returneze valori:

$count = $database->transaction(function ($database) {
	$result = $database->query('UPDATE users SET active = ?', true);
	return $result->getRowCount(); // returnează numărul de rânduri actualizate
});
versiune: 4.0