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