2012-05-08 12 views
12

Le chiamate di funzione possono verificarsi all'interno di un blocco di transazione PDO? Questo codice è semplificato (utilizzando database MySql) ...Transazioni PDO e chiamate di funzioni

try{ 
    $db->beginTransaction(); 

    // call to function that creates user 
    $user_id = create_user(); 

    // call to function that creates company  
    $company_id = create_company(); 

    // call to function to link user & company 
    add_user_to_company($user_id, $company_id); 

    $db->commit(); 
} 

Se questo non può accadere con le transazioni, qual è la strategia raccomandata?

risposta

11

A meno che nessuna di tali chiamate di funzione tenti di aprire o eseguire il commit di una transazione o di utilizzare una connessione diversa da quella memorizzata in $db, sì, dovrebbe funzionare correttamente. L'oggetto PDO (o il RDBMS per quella materia) non sa o si preoccupa se stai chiamando altre funzioni in PHP. Tutto ciò che sa è se l'azione si svolge sulla stessa connessione aperta di quella aperta in $db. Supponiamo che tali funzioni ricevano o $db come parametro o accedano a livello globale.

Ricordare che sebbene il PDO tenga traccia dello stato della transazione (esposto tramite PDO::inTransaction()), è in realtà l'RDBMS che sta gestendo lo stato della transazione, non il PDO o il codice dell'applicazione PHP. Se, una funzione tenta di aprire una nuova transazione prima che il precedente è stato commesso, MySQL's documented behavior è quello di auto-commit della transazione precedente in quanto non supporta transazioni nidificazione.

Quindi, tanto per essere sicuro le chiamate di funzione aggiuntive non stanno tentando di cambiare lo stato delle transazioni.

+1

Per chiarire ulteriormente, le transazioni nidificate non sono supportate in MySQL, in modo da essere sicuri che non stai iniziando una transazione all'interno di qualsiasi delle funzioni, altrimenti si [commit automaticamente la transazione in sospeso] (http: //dev.mysql .com/doc/refman/5.5/it/implicita-commit.html). –

+1

Assicuratevi inoltre di non usare alcun tipo di DDL (create/alter/drop statement) perché commetteranno qualsiasi transazione in corso. – Kris