PDA

Visualizza versione completa : [PHP] Schema per transazioni con db


Alhazred
31-03-2009, 20.44.26
Mi trovo a dover eseguire sul db 3 query diverse, in particolare 3 delete su diverse tabelle, ma devo essere sicuro che vengano effettuate tutte e 3 oppure nessuna.
Mi sono trovato in passato in questa situazione usando JSP ed ho risolto impostando l'autocommit a false, messo le diverse query all'interno di un try, committate (azz che brutta parola) e poi messo una catch con rollback.
Una cosa cosė:

try {
conn.setAutocommit(false);
query1 = "Un'operazione sul db";
query2 = "Un'altra operazione sul db";
query3 = "Un'ultima operazione sul db";

query1.executeUpdate();
query2.executeUpdate();
query3.executeUpdate();

conn.commit();
}
catch (SQLException ex) {
//vari messaggi d'errore

conn.rollback();
}
ecc, ecc...

Bene, suppongo che in PHP la cosa sia molto simile, ma non so praticamente come si fa.
Come sarebbe lo schema da seguire?
Come imposto l'autocommit a false?
Come si fa il commit di una query se l'autocommit č false?
Come si esegue il rollback?

Alhazred
31-03-2009, 23.19.00
Dimenticavo una cosa importante, il db č mysql.

Alhazred
01-04-2009, 11.44.28
Ho risolto cosė

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");

$del_tab1 = mysql_query("DELETE FROM tab1 WHERE codice='".$codice."'",$db);
$del_tab2 = mysql_query("DELETE FROM tab2 WHERE codice='".$codice."'",$db);
$del_tab3 = mysql_query("DELETE FROM tab3 WHERE codice='".$codice."'",$db);

if((!$del_tab1) || (!$del_tab2) || (!$del_tab3)) {
mysql_query("ROLLBACK");
mysql_query("SET AUTOCOMMIT=1");
return false;
}
else {
mysql_query("COMMIT");
mysql_query("SET AUTOCOMMIT=1");
return true;
}