2010-01-25 10 views
5

mia piattaforma:PHP e MySQL: il codice semplice da implementare transazione - Commit e rollback

PHP & mySQL

la mia situazione:

Sto cercando di implementare le transazioni all'interno del mio codice . Ho provato a seguire degli esempi, ma non è di grande aiuto. Sono in esecuzione 3 query e volevo scrivere una transazione in modo tale che se una qualsiasi delle query fallisse, l'intera transazione dovrebbe tornare indietro. Gradirei davvero un semplice, efficiente e codice PHP non orientato agli oggetti per raggiungere questo obiettivo. Grazie in anticipo.

MY codice PHP:

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
//commit --- but how? 
} 
else 
{ 
//rollback --- but how? 
} 
+1

una risposta semplice ed ECCELLENTE/esempio (try catch) è stata data alla stessa domanda a http://stackoverflow.com/questions/2708237/php-mysql-transactions-example deve leggere, mostra ESATTAMENTE cosa fare in chiaro e termini chiari. –

+0

Controlla questo http://dev.mysql.com/doc/refman/5.0/en/commit.html. Questo dovrebbe indirizzarti nella giusta direzione. –

risposta

6

È necessario utilizzare il mysqli extension per utilizzare questa funzionalità.

See: autocommit(), commit(), e rollback()

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 

/* delete all rows */ 
mysqli_query($link, "DELETE FROM myCity"); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity.\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Rollback */ 
mysqli_rollback($link); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity (after rollback).\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Drop table myCity */ 
mysqli_query($link, "DROP TABLE myCity"); 

mysqli_close($link); 
?> 
+0

@John Grazie per la risposta. Ho creato oltre l'85% della mia applicazione usando mysql_query. Penso che dovrò modificare la mia applicazione e rielaborarla da zero se devo usare mysqli. È possibile in qualche modo, farlo usando mysql_query? Non sono sicuro di poter passare a mysqli in questo momento, quindi una soluzione alternativa è molto apprezzata. Rimango in attesa di una sua risposta. – Devner

+2

Purtroppo no. Le funzioni mysql_ * non offrono accesso alle funzionalità avanzate offerte da MySQL 4 e successive come transazioni e stored procedure. Non è necessario tornare indietro e modificare ogni chiamata a MySQL per utilizzare mysqli. Basta cambiare le pagine che effettivamente avranno bisogno di usarlo. –

+0

Ci proverò. Grazie. – Devner

13

Non è necessario utilizzare mysqli. Puoi semplicemente emettere i comandi di transazione come query.

Così, per il tuo esempio:

mysql_query("start transaction;"); 

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
    mysql_query("commit;"); 
} 
else 
{ 
    mysql_query("rollback;"); 
} 

In che modo se state pensando di passare a MySQLi, per favore non fare. Passa invece al PDO, è molto più sano.

+0

Penso che tu intenda mysql_query ("avvia transazione"); o mysql_query ("begin"); – Rooster242

+0

Sì, sono confuso tra i due ... Risolverò. – rjmunro

+0

mysql non è sicuro, prova a usare mysqli o PDO – Asuquo12

Problemi correlati