Sto cercando di creare un contatore mysql, su un server con PHP, che in sostanza ritorna un numero+1 ogni volta che viene chiamato.
Come fosse un campo autoincrementante, solo che lo voglio manipolare io.
A macro-blocchi avevo pensato
lock table xxx WRITE;
leggi il contatore, incrementalo, scrivilo
unlock tables;
Fin qui bene, non ho problemi di prestazioni in quanto il contatore verrà richiamato 10 o 20 volte al giorno da 5 o 6 client, quindi lock table mi va benissimo... MA
quando c'è un LOCK TABLE in corso gli altri client rimangono "congelati", e questo è bene.
Purtroppo non so se esiste un modo per far andare in timeout dopo un po' la connessione, ho bisogno che se dopo 3 o 5 secondi la richiesta non è andata a buon fine il client "si svegli".
Allora ho provato coi LOCK di mysql, e questo funziona bene, anche perchè c'è la funzione di test rapido che mi consente di "sbloccare" subito un client se il lock è già attivo.
Se risulta libero => provo ad acquisirlo. In pratica spero di avere fortuna, nel caso peggiore aspetto il timeout che è impostabile
Ma ho notato che il LOCK è sempre libero per le varie connessioni, in quanto immagino che l'utente mysql-php sia sempre quellocodice:$query='SELECT IS_FREE_LOCK("lock_zconta");'; $result = mysql_query($query, $db) or die('-6'); $row=mysql_fetch_row($result); if ($row[0]=='0') die('-7'); $query='SELECT GET_LOCK("lock_zconta",5);'; $result = mysql_query($query, $db) or die('-8'); $row=mysql_fetch_row($result); if ($row[0]=='0') die('-9'); $query = 'SELECT coalesce(max(ultimoid),100000) as massimo from '.$fulltabella; $result = mysql_query($query, $db) or die(mysql_error('-10')); $row = mysql_fetch_assoc($result); $massimo = $row['massimo']+1; echo $massimo; $query = 'INSERT into '.$fulltabella.'(ultimoid,modo,richiedente,ip) values ('.$massimo.',"'.$modo.'","'.$richiedente.'","'.$_SERVER["REMOTE_ADDR"].'")'; $result = mysql_query($query, $db) or die(mysql_error('-11')); $query='SELECT RELEASE_LOCK("lock_zconta");'; $result = mysql_query($query, $db) or die(mysql_error('-12'));
Quindi cerco di formulare la richiesta così:
si può chiedere per mysql una LOCK TABLE WRITE con timeout?
E se no, come posso fare?
PS aggiungo che questo è ovviamente un frammento, in quanto il contatore lo devo manipolare come mi piace, mentre un autoincrementante "partirebbe" ed andrebbe avanti per i fatti suoi.
Ho tolto la logica che ritorna il contatore, più complessa di un semplice "+1", non è quello che mi interessa.



Rispondi quotando

)
