Problemet är att du försöker använda MySQL-nivålåsning för att säkerställa att en biljett inte kan tilldelas mer än en person. På så sätt finns det inget sätt att upptäcka om en biljett är låst av en användare.
Jag skulle implementera ett applikationsnivålås genom att lägga till 2 låsrelaterade fält till biljetttabellen:en tidsstämpel när låset tillämpades och ett användar-id-fält som talar om vilken användare som har låset. De låsrelaterade fälten kan hållas i ett annat bord (varukorgen kan till exempel användas för detta ändamål).
När en användare väljer en biljett försöker du uppdatera dessa låsfält med en villkorlig uppdatering:
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
Värden i stället för ...
tillhandahålls av din ansökan. lock_time is null
kriterier finns för att säkerställa att om biljetten redan har valts av en annan användare, så åsidosätter inte den senare användaren låset. Kontrollera antalet rader som påverkas efter uppdateringssatsen. Om det är en, så skaffade den nuvarande användaren låset. Om det är 0, då har någon annan låst biljetten.
Om du har låsdata i en annan tabell, placera då en unik begränsning på biljett-id-fältet i den tabellen och använd insert för att skaffa ett lås. Om insättningen lyckas, så förvärvas låset. Om det misslyckas har en annan användare låst biljetten.
Låset hålls vanligtvis i ett antal minuter, efter det måste din applikation släppa låset (ställ in låsfälten på noll eller ta bort låsposten från den andra tabellen).