Visualizzazione dei risultati da 1 a 10 su 14

Visualizzazione discussione

  1. #1
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290

    Mysql, PHP, contatori, lock table & locks in generale

    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


    codice:
    $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'));
    Ma ho notato che il LOCK è sempre libero per le varie connessioni, in quanto immagino che l'utente mysql-php sia sempre quello

    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.
    Ultima modifica di brancomat; 21-12-2013 a 23:14

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.