Problém je v tom, že se snažíte použít zamykání na úrovni MySQL, abyste zajistili, že lístek nelze přiřadit více než jedné osobě. Tímto způsobem neexistuje způsob, jak zjistit, zda je lístek uzamčen uživatelem.
Implementoval bych zámek na úrovni aplikace přidáním 2 polí souvisejících se zámkem do tabulky lístků:časové razítko, kdy byl zámek aplikován, a pole ID uživatele, které vám řekne, který uživatel má zámek. Pole související se zámkem mohou být uložena v jiné tabulce (k tomuto účelu lze použít například nákupní košík).
Když uživatel vybere lístek, pokusíte se aktualizovat tato pole zámku příkazem podmíněné aktualizace:
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
Hodnoty namísto ...
jsou dodávány vaší aplikací. lock_time is null
Kritéria slouží k zajištění toho, že pokud byl lístek již vybrán jiným uživatelem, pozdější uživatel nepřepíše zámek. Po prohlášení o aktualizaci zkontrolujte počet ovlivněných řádků. Pokud je jeden, pak aktuální uživatel získal zámek. Pokud je 0, pak lístek zamkl někdo jiný.
Pokud máte zamykací data v jiné tabulce, umístěte jedinečné omezení na pole id tiketu v této tabulce a použijte insert k získání zámku. Pokud vložení uspěje, zámek je získán. Pokud selže, jiný uživatel zamkl lístek.
Zámek je obvykle držen po dobu několika minut, poté musí vaše aplikace zámek uvolnit (nastavit zamykací pole na nulu nebo odstranit zamykací záznam z druhé tabulky).