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