Newsgroup: it.comp.www.php
Titolo: PHP + MySQL Lock-Unlock

Ciao a tutti,
il mio problema è questo.
In una stessa pagina devo fare una query di questo tipo:
$result = mysql_query ("INSERT INTO domande_sostenute (ID, ID_domande)
VALUES ('','$ID_domanda_fatta', )");
$ID_domande_sostenute=mysql_insert_id();
..........
while(list($chiave,$valore)=each($vettore)) {
$result = mysql_query ("INSERT INTO risposte_date (ID, ID_domande_sostenute)
VALUES ('', $ID_domande_sostenute)")
      or die ("Invalid query: risposte_date");
};
In pratica devo:
1- Fare un inserimento
2- Prendere l'ultimo record inserito
3- Fare una serie di inserimenti sulla base dell'ID appena inserito
Il problema che mi si pone è che c'è il rischio che in una situazione
multi-utente avvenga una situazione di questo tipo:
Utente A passo 1
Utente B passo 1
Utente A passo 2
Utente A passo 3
Utente B passo 2
Utente B passo 3
mentre vorrei che la situazione sia questa:
Utente A passo 1
Utente A passo 2
Utente A passo 3
Utente B passo 1
Utente B passo 2
Utente B passo 3
Cosa dovrei fare per eliminare questo rischio?
Ciao
Leonardo

 Cosa dovrei fare per eliminare questo rischio?
Niente.
Con $ID_domande_sostenute associ senza alcun rischio. Il valore non cambia
mentre fai il loop ed e sempre associato al ID del Inserimento in quella
sessione, anche se un altro utente sta inserendo in questo stesso momento.
La situazione sarebbe diverse se lo script viene eseguito in piu' passi e
richiedi sempre la mysql_insert_id() senza fare un insert (dovresti passare
l'Id associato al INSERT). Leggi magari anche su 
mysql.org
 la documentazione
su LAST_INSERT_ID().
HTH
Jurgen


La mia perplessità è che credo che la funzione LAST_INSERT_ID() è una
funzione "globale" e non si riferisce alla sessione utente.
Ad esempio:
supponiamo che dopo aver fatto il primo inserimento, invece di eseguire la
successiva istruzione (LAST_INSERT_ID()) viene fatto un'altro inserimento da
un altro utente. è possibile? non so se mi sono spiegato...
Del tipo
Insert utente A (che determina un nuovo ID ad esempio 51)
Insert utente B (che determina un nuovo ID ad esempio 52)
Utente A: Last_insert_id vale 52
Utente B: Last_insert_id vale 52
Invece dovrebbe essere:
Insert utente A (che determina un nuovo ID ad esempio 51)
Utente A: Last_insert_id vale 51
Insert utente B (che determina un nuovo ID ad esempio 52)
Utente B: Last_insert_id vale 52
Scusate se non riesco ad essere troppo chiaro, ma non so come spiegare il
concetto...
Vorrei insomma garantire la "serialità" di alcune parti di codice... per
essere sicuro che appena PHP mi comincia a processare una pagina, non
subentri nessun altro utente che mi interrompe l'esecuzione
Ciao
Leonardo

 ha scritto nel messaggio
news:IutL8.8429$K4.1...@twister2.libero.it...


 funzione "globale" e non si riferisce alla sessione utente.
Allora non hai letto la documentazione!!!!
Lettura della maestra dal libro (zitti, anche tu):
[...] The last ID that was generated is maintained in the server on a
per-connection basis. It will not be changed by another client. It will not
even be changed if you update another AUTO_INCREMENT column with a non-magic
value (that is, a value that is not NULL and not 0).
[...]
"Allora, ancora domande?"
"Tommaso? Si?"
Per credere fai seguente: scrivi uno script in PHP
e fai
script 1:
  msyql_query("INSERT INTO blabla (Utente) VALUES ('A')");
  sleep(20);
  echo mysql_insert_id();
script 2:
  msyql_query("INSERT INTO blabla (Utente) VALUES ('B')");
  sleep(20);
  echo mysql_insert_id();
e li lanci in due finestre...

 > > richiedi sempre la mysql_insert_id() senza fare un insert (dovresti
                         ^^^^^^^^^^^^^^^^^
Leggi meglio che cosa ha scritto nel msg!
E quota meglio: 
http://php.dopoil.com/mfaq.php
Saluti
Jurgen

 e fai
illuminante !
ora provo :-)
ciao, grazie!
Leonardo