Normalmente un sistema di ticket per avere stati per ogni ticket, costituito in minima parte da "aperto" e "chiuso" (anche se potrebbe essere molto più complesso).
Avere un altro stato chiamato "in corso", insieme a un assegnatario (utente). Quando qualcuno va a ritirare il biglietto, lo si cambia in "in corso" e lo si imposta come assegnatario.
Il trucco è di controllare esplicitamente lo stato durante la transizione, in modo atomico. Ad esempio, se stai usando SQL, dovresti fare qualcosa del genere:
UPDATE ticket SET
state = 'inprogress',
assignee = @thisUserId,
WHERE ticketId = @ticketId
AND state = 'open'
AND assignee = @currentAssignee
Le ultime due linee WHERE assicurano che non ci siano conflitti: se due utenti decidono entrambi di prendere il ticket contemporaneamente, solo una di queste query può funzionare - l'altra fallirà, perché lo stato e / o l'assegnatario è cambiato (facendo ora che le righe corrispondano alla condizione di aggiornamento).
È possibile rilevare questa condizione (0 righe aggiornate) e quindi mostrare un messaggio che dice qualcosa sull'effetto di "Mi dispiace, il ticket non può più essere assegnato" e ricaricare lo stato corrente dal database.