Váš problém se scvrkává na otázku "jaký by měl být synchronizační zámek" . Z vašeho dotazu se zdá, že rezervace není rezervací konkrétní položky. Předpokládejme však, že uživatel si rezervuje konkrétní hotelový pokoj, takže musíte vyřešit dva problémy:
- zabránit nadměrné rezervaci (např. rezervaci stejné věci pro dvě osoby)
- zabránit nesprávnému výpočtu stavu paralelního účtu
Když se tedy uživatel dostane do bodu, kdy se chystá stisknout tlačítko potvrdit Toto je možný scénář, který můžete implementovat:
-
zahájit transakci
-
uzamknout uživatelský záznam, aby byly blokovány paralelní procesy
SELECT * FROM user FOR UPDATE WHERE id = :id
-
znovu zkontrolujte zůstatek účtu a v případě nedostatku finančních prostředků vyhoďte výjimku / vrácení zpět
-
uzamkněte položku, kterou chcete zarezervovat, abyste zabránili nadměrné rezervaci
SELECT * FROM room FOR UPDATE WHERE id = :id
-
znovu zkontrolujte dostupnost rezervace a vyvolejte výjimku / vrácení zpět, pokud je položka již rezervována
-
vytvořit záznam rezervace a odečíst prostředky z účtu uživatele
-
potvrzení transakce (všechny zámky budou uvolněny)
Pokud ve vašem případě nepotřebujete kontrolovat nadměrnou rezervaci, jednoduše přeskočte / ignorujte kroky 4 a 5.