Transações
As transações garantem que todas as operações dentro da transação sejam executadas com êxito ou que nenhuma seja executada. Elas são essenciais para manter a consistência dos dados durante operações mais complexas.
A maneira mais simples de usar transações é a seguinte:
$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;
}
Uma forma muito mais limpa e elegante de obter o mesmo resultado é usar o método transaction()
. Esse método
aceita um retorno de chamada como parâmetro, que é executado dentro da transação. Se a callback for executada sem lançar uma
exceção, a transação será confirmada automaticamente. Se uma exceção for lançada, a transação será revertida e a
exceção continuará sendo propagada.
$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'
]);
});
O método transaction()
também pode retornar valores:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // retorna o número de linhas atualizadas
});