Заключването се извършва по време на (обикновено в началото или близо до) изпълнението на команда. Заключването (с изключение на препоръчителните) се освобождава само когато транзакция се извършва или се връща назад. Няма FOR UNLOCK
, нито има UNLOCK
команда за обръщане на ефектите от LOCK
на ниво таблица команда. Всичко това е обяснено в раздела за контрол на паралелността в документацията на PostgreSQL.
Трябва да ангажирате или отмените транзакцията си, за да освободите заключванията.
Освен това всъщност няма смисъл да питате „изтрит ли е този ред вече от друга едновременна транзакция“. Всъщност не се изтрива, докато транзакцията, която е изтрила реда, не се ангажира... и дори тогава тя може да е изтрила и повторно вмъкнала реда или друга едновременна транзакция може да е вмъкнала реда отново.
Случайно изграждате ли система за опашка от задачи или опашка за съобщения, защото ако е така, този проблем е решен и не бива да се опитвате да преоткривате това необичайно сложно колело. Вижте PGQ, ActiveMQ, RabbitMQ, ZeroMQ и др. (Бъдещите версии на PostgreSQL може да включват FOR UPDATE SKIP LOCKED
тъй като това се тества, но не е пуснато към момента на писане).
Предлагам ви да публикувате нов въпрос с по-подробно описание на основния проблем, който се опитвате да разрешите. Предполагате, че решението на проблема ви е „разберете дали редът вече е изтрит“ или „отключете реда“. Това вероятно всъщност не е решението. Това е малко като някой да каже "къде да купя бензин", когато моторът му не върви, така че те предполагат, че е свършило горивото. Горивото не е проблемът, проблемът е, че моторите за тласкане не поемат гориво и трябва да ги въртите с педали.
Обяснете фона. Обяснете какво се опитвате да постигнете. Преди всичко друго, не публикувайте псевдокод, публикувайте действителния код, с който имате проблеми , за предпочитане в самостоятелна и работеща форма.