Uzamčení se provádí během (obvykle na začátku nebo blízko začátku) provádění příkazu. Zámky (kromě poradních zámků) jsou uvolněny pouze když se transakce potvrdí nebo vrátí zpět. Neexistuje žádné FOR UNLOCK
, ani zde není UNLOCK
příkaz ke zvrácení účinků LOCK
na úrovni tabulky příkaz. To vše je vysvětleno v části Concurrency control v dokumentaci PostgreSQL.
Chcete-li uvolnit zámky, musíte transakci potvrdit nebo vrátit zpět.
Navíc opravdu nemá smysl ptát se „byl tento řádek již smazán jinou souběžnou transakcí“. Ve skutečnosti se nesmaže, dokud se transakce, která řádek smazala, nepotvrdí... a dokonce i poté by mohla řádek smazat a znovu vložit nebo jiná souběžná transakce mohla řádek vložit znovu.
Vytváříte si náhodou frontu úloh nebo systém front zpráv, protože pokud ano, je problém vyřešen a neměli byste se pokoušet znovu vymýšlet to neobvykle složité kolo. Viz PGQ, ActiveMQ, RabbitMQ, ZeroMQ atd. (Budoucí verze PostgreSQL mohou obsahovat FOR UPDATE SKIP LOCKED
protože se testuje, ale v době psaní tohoto článku nebyl vydán).
Navrhuji, abyste zveřejnili novou otázku s podrobnějším popisem základního problému, který se snažíte vyřešit. Předpokládáte, že řešením vašeho problému je "zjistit, zda byl řádek již smazán" nebo "odemknout řádek". To asi fakt není řešení. Je to trochu jako když někdo řekne "kde koupím benzín", když mu nejede motorka, takže předpokládá, že mu došla palivo. Palivo není problém, problém je v tom, že tlačná kola neberou palivo a musíte na nich šlapat.
Vysvětlete pozadí. Vysvětlete, čeho se snažíte dosáhnout. Především nezveřejňujte pseudokód, zveřejňujte skutečný kód, se kterým máte problémy , nejlépe v samostatné a spustitelné formě.