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

Optimistická fronta zamykání

Pro optimistické zamykání musíte definovat některé prostředky, jak zkontrolovat, zda se řádek změnil od doby, kdy jste jej viděli naposledy. Například stačí přidat další identifikátor:

alter table regions_indexes add version_id integer default 1 not null;

Nyní aplikace načte nějaký řádek, zobrazí data uživateli a počká, dokud neklikne na tlačítko. Musíme si zapamatovat hodnotu version_id máme.

Po kliknutí na tlačítko provedete všechny potřebné výpočty. Až budete připraveni řádek aktualizovat, uzamknete jej a zkontrolujete, zda version_id se nezměnilo. Pokud ne, zvyšte version_id a zavázat se. Pokud ano, smůla --- musíte uživateli říct, aby operaci zopakoval, protože ho někdo předběhl.

Může to vypadat takto (v pseudokódu):

-- remember version_id
select *
from regions_indexes
where id = ... and resource_type = ...;

-- wait for user click
-- you can wait for a long time, because no lock is yet acquired
...

update regions_indexes
set current_resource = current_resource - ..., version_id = version_id + 1
where id = ... and resource_type = ...
returning version_id;

if new_version_id = old_version_id + 1 then
  -- success, commit
else 
  -- fail, rollback
end if;

Optimistické zamykání však nefunguje dobře v situaci vysoké souběžnosti. Pokud konflikty nejsou výjimečné, budete muset transakce často restartovat.




  1. Sbírejte rekurzivní klíče JSON v Postgresu

  2. Použijte TYPE_NAME() k získání názvu datového typu na serveru SQL

  3. spojil řádky tabulky do sloupců s názvy sloupců z původních řádků

  4. jádro asp.net Oracle.DataAccess System.BadImageFormatException:Nelze načíst soubor nebo sestavení Oracle.DataAccess