Problema Transazioni

Ciao a tutti,

sto cercando di fare un carrello con php.

Per farlo utilizzo le transazioni, scalando la disponibilità del prodotto solo se l'utente giunge al termine della prenotazione (creo la query quando il prodotto viene inserito nel carrello, ma la eseguo solo alla conferma), così, se l'utente mette in carrello N prodotti, poi chiude il browser evito di fare modifiche al DB.

Qui nasce il problema, ossia, se faccio questo per un prodotto solo tutto ok, ma nel caso dovessi farlo per 2o+ prodotti lo script mi va in max execution time...

if(!isset($_SESSION['carrello']))
      {         
         mysql_query("START TRANSACTION;");
      }      
      
if(mysql_query("UPDATE prodotto SET disponibilita = '$dispo' WHERE IDprodotto ='$IDprodotto'"))
 $_SESSION['carrello'] = ".....";

Il commit lo faccio in un'altra pagina...potrebbe essere questo il problema?Cioè aprire la transazione in una pagina e fare commit in un'altra?

L'autocommit non l'ho modificato mettendolo a 0 ma l'ho lasciato a 1.

Ringrazio anticipatamente.

ciao

Lore

inviato 10 anni fa
Lore
Lore
1
modificato 10 anni fa
X 0 X

up   :(

risposto 10 anni fa
Lore
Lore
1
X 0 X

Max execution time vuol dire che ci mette troppo. Sei sicuro che il problema sia solo in quell'update? Cosa fai di altro?

Se è lì è probabile che la tabella non sia ottimizzata. Hai un indice su IDprodotto?

Se fai la stessa query a mano quanto ci mette?

risposto 10 anni fa
Senamion
X 0 X
Max execution time vuol dire che ci mette troppo.

Questo lo so...  ;)

Sei sicuro che il problema sia solo in quell'update? Cosa fai di altro?

Se è lì è probabile che la tabella non sia ottimizzata. Hai un indice su IDprodotto?

Se fai la stessa query a mano quanto ci mette?

Il problema non è l'update, perchè se le eseguo singolarmente vanno...

CMQ IDprodotto è la chiave primaria della tabella

Credo che il problema stia nella transazione, forse per il fatto che faccio il commit in una pagina differente da quella in cui faccio lo "start transaction"...ma è solo una supposizione.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X
Credo che il problema stia nella transazione, forse per il fatto che faccio il commit in una pagina differente da quella in cui faccio lo "start transaction"...ma è solo una supposizione.

non è una supposizione, è la dura realtà! Quando uno script termina chiude la connessione a MySQL che a sua volta manda in rollback tutte le transazioni aperte....

Purtroppo con PHP non puoi usare questa strategia.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni per la risposta!

Già che ci sono ti faccio un'altra domanda: e nel caso, se si mettesse in sessione l'id della connessione?

Sarebbe una cosa fattibile?

al momento sono sprovvisto dei mezzi per provarci, se qualcuno ha tentato, mi dice se la cosa è possibile?

Ormai rimane solo una curiosità perchè dato il tempo stretto per finire il lavoro, con il collega con cui sto facendo questa cosa si è optato per una diversa soluzione...

grazie.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

non si può salvare l'id della connessione in sessione per 2 motivi:

1) l'id è una "risorsa" e pertanto non può essere conservata come una normale variabile

2) la connessione a MySQL, anche se persistente, non può essere reciclata deterministicamente.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ok.grazie1000

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda