L'idea che generalmente utilizzo quando lavoro con le transazioni è simile a questa (semi-pseudo-code) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
Si noti che, con questa idea, se una query non riesce, deve essere generata un'eccezione:
- PDO può farlo, a seconda di come lo configuri
- Vedi
PDO::setAttribute
- e
PDO::ATTR_ERRMODE
ePDO::ERRMODE_EXCEPTION
- Vedi
- altrimenti, con qualche altra API, potresti dover testare il risultato della funzione utilizzata per eseguire una query e generare tu stesso un'eccezione.
Purtroppo non c'è nessuna magia coinvolta. Non puoi semplicemente inserire un'istruzione da qualche parte e fare in modo che le transazioni vengano eseguite automaticamente:devi comunque specificare quale gruppo di query deve essere eseguito in una transazione.
Ad esempio, molto spesso avrai un paio di domande prima della transazione (prima di begin
) e un altro paio di query dopo la transazione (dopo commit
o rollback
) e vorrai che quelle query vengano eseguite indipendentemente da ciò che è successo (o meno) nella transazione.