2010-07-28 10 views
5

il mio problema è, ho una progettazione di database da questo collegamento is my database overdesigned?Dove eseguire il rollback di una transazione in DOP?

modifica * ok forse utilizzando la transazione? ma dove devo mettere il rollback se fallisce?

$dbConnect->beginTransaction(); 
$RegisterInsert = $dbConnect->prepare("INSERT INTO companies (
    `name`, `address`, `email`, `phone`, `link`, `verified`) VALUES (
    :name, :address, :email, :phone, :link, :verified)"); 
    $RegisterInsert->execute($RegisterData); 

    $RegisterData2['CID'] = $dbConnect->lastInsertId(); 

    $RegisterInsert = $dbConnect->prepare("INSERT INTO users_companies (
    `UID`, `CID`, `role`) VALUES (
    :UID, :CID, :role)"); 
    $RegisterInsert->execute($RegisterData2); 
    $dbConnect->commit(); 

dove devo inserire il rollback?

Grazie

+1

direi di sì ... – pascal

+0

yup im un po 'confuso devo fare transazioni cosa? (non l'ho mai usato) o faccio solo così, o forse qualcuno si unisce? o altri che possono mancare, grazie Pascal per lasciare un commento :) –

+0

possibile duplicato di: http://stackoverflow.com/questions/2167853/insert-entries-in-multiple-tables-in-php, http : //stackoverflow.com/questions/2449132/run-mysql-insert-query-multiple-times-insert-values-into-multiple-tables, http://stackoverflow.com/questions/3225024/mysql-insert- to-multiple-tables-relational, http://stackoverflow.com/questions/1582834/php-mysql-inserting-data-to-multiple-tables –

risposta

4

Una transazione dovrebbe terminare con un rollback() o un commit(), (solo uno di loro)

Il suo solito utilizzato con un if...else economico come logicamente solo deve essere eseguito uno di loro.

$dbConnect->beginTransaction(); 

//somecode 
//$dbConnect->execute($someInsert); 
//some more code 
//$result = $dbConnect->execute($someSelect); 
//$nextRow = $result->fetchRow(); 

//either commit or rollback! 
if($someResultCheck == true) 
    $dbConnect->commit(); 
else 
    $dbConnect->rollback(); 

Le transazioni sono di solito utilizzati quando c'è una logica complessa coinvolti con le query.

Se si utilizza MySQL, assicurarsi di non utilizzare il motore MyISAM per le tabelle, in quanto non supporta le transazioni.

+0

quindi il mio codice sopra il rollback automatico se fallisce? –

+0

Il tuo codice non è garantito per il rollback automatico a meno che autoCommit sia impostato su false –

+0

ok dovremmo fare un $ someResultCheck?, Su RegisterInsert? ho ragione ? –

4

Non appena si sa che l'operazione nel suo complesso sta per fallire allora si dovrebbe far ritirare quello che hai fatto fino ad ora e non cercare ulteriori aggiornamenti - così in pseudo-codice:

function do_updates(array updates) 
{ 
    PDO->beginTransaction(); 
    foreach (updates as statement) { 
     run statement 
     if failed { 
     PDO->rollback(); 
     return false; 
     } 
    } 
    return PDO->commit(); 

HTH

C.

Problemi correlati