Mysql
 sql >> Database >  >> RDS >> Mysql

Ottimizzazione della logica di MySql

Il problema è che stai cercando di utilizzare il blocco del livello MySQL per garantire che un ticket non possa essere assegnato a più di una persona. In questo modo non c'è modo di rilevare se un ticket è bloccato da un utente.

Implementerei un blocco a livello di applicazione aggiungendo 2 campi relativi al blocco alla tabella dei biglietti:un timestamp quando è stato applicato il blocco e un campo ID utente che ti dice quale utente detiene il blocco. I campi relativi al blocco possono essere conservati in un'altra tabella (il carrello, ad esempio, può essere utilizzato per questo scopo).

Quando un utente seleziona un ticket, provi ad aggiornare questi campi di blocco con un'istruzione di aggiornamento condizionale:

update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null

Valori al posto di ... sono forniti dalla tua applicazione. lock_time is null i criteri sono lì per assicurarsi che se il ticket è già stato selezionato da un altro utente, l'utente successivo non annulli il blocco. Dopo la dichiarazione di aggiornamento, controlla il numero di righe interessate. Se è uno, l'utente corrente ha acquisito il blocco. Se è 0, allora qualcun altro ha bloccato il ticket.

Se si dispone dei dati di blocco in un'altra tabella, inserire una restrizione univoca sul campo ID ticket in quella tabella e utilizzare l'inserimento per acquisire un blocco. Se l'inserimento ha esito positivo, viene acquisito il blocco. Se fallisce, un altro utente ha bloccato il ticket.

Il blocco viene generalmente mantenuto per un certo numero di minuti, dopodiché l'applicazione deve rilasciare il blocco (impostare i campi di blocco su null o eliminare il record di blocco dall'altra tabella).