Mysql
 sql >> Database >  >> RDS >> Mysql

Esempi di transazioni PHP + MySQL

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
  • 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.