sql >> Databáze >  >> RDS >> PostgreSQL

Scénáře souběžnosti s INSERTs

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:

  1. zahájit transakci

  2. uzamknout uživatelský záznam, aby byly blokovány paralelní procesy

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. znovu zkontrolujte zůstatek účtu a v případě nedostatku finančních prostředků vyhoďte výjimku / vrácení zpět

  4. uzamkněte položku, kterou chcete zarezervovat, abyste zabránili nadměrné rezervaci

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. znovu zkontrolujte dostupnost rezervace a vyvolejte výjimku / vrácení zpět, pokud je položka již rezervována

  6. vytvořit záznam rezervace a odečíst prostředky z účtu uživatele

  7. 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.



  1. Přeskočí úloha SQL Server plánované spuštění, pokud již běží?

  2. Postup PL/SQL:Jak vrátit příkaz select?

  3. Jak odečíst 2 data v oracle, abyste získali výsledek v hodině a minutě

  4. Při mapování sloupce PostgreSQL LTREE v režimu spánku se zobrazuje chyba