Un saluto.
Spiego brevemente la mia situazione:
Il mio database possiede una tabella contenente diversi record e in ogni record, tra gli altri, e' presente un campo chiamato quantita. Gli utenti che accedono al sito possono vedere su di una pagina tali record (e quindi anche il campo in questione), selezionarne uno (mediante apposito link) e da qui essere rimandati ad una nuova pagina dove poter scalare un certo valore a tale quantita.
La quantita non può mai essere negativa e in tal caso l'operazione (che la farebbe diventare negativa) non può essere eseguita.
Ora supponiamo che un record i abbia come quantita 100 e che un utente lo selezioni dalla prima pagina e che nella seconda pagina decida di scalare 80. L'operazione non crea problemi e la quantita viene aggiornata a 20.
Se pero' l'utente tra una pagina e l'altra (quindi dopo aver selezionato il record, ma prima di confermare lo scalo di 80 alla quantita) attende un certo periodo di tempo tale che un nuovo utente riesca nel mentre a selezionare anch'esso il record i e a scalare, ad esempio, 40 confermando l'operazione, ora si avrebbe che il primo utente andrebbe, nel momento in cui finalmente conferma lo scalo, a scalare 80 dai 60 restanti (andando a -20, cosa non ammissibile) e non i soliti 80 dai 100 iniziali.
Di fatto basterebbe che nel momento in cui si conferma lo scalo dalla quantita si potesse fare in un'unica "passata" sia un ricontrollo dell'attuale campo quantita, sia lo scalo effettivo (se questo risulta ovviamente ancora possibile).
Utilizzando tabelle di tipo InnoDB il tutto si risolverebbe mediante transazioni, ma con tabelle di tipo MyISAM cio' non e' possibile.
Esistono altri modi per risolvere il problema di accesso esclusivo? Eventualmente anche bloccando l'accesso alla tabella per il tempo strettamente necessario per effettuare in rapida successione le 2 operazioni di ricontrollo e scalo?
Cercando sulla documentazione di MySql ho trovato le istruzioni GET_LOCK (str, timeout) e RELEASE_LOCK (str) ma non ho capito se e come possono risolvere questo mio problema.
Grazie in anticipo per l'aiuto