Заблокировки выполняются во время (обычно в начале или в начале) выполнения команды. Замки (кроме advisory locks) освобождаются только, когда сделка совершает или откатывает назад. Нет FOR UNLOCK
, и нет команды UNLOCK
, чтобы отменить эффекты команды уровня LOCK
на уровне стола. Все это объяснено in the concurrency control section of the PostgreSQL documentation.
Вы должны зафиксировать или отменить транзакцию для освобождения блокировок.
Кроме того, на самом деле не имеет смысла спрашивать «эта строка уже удалена другой параллельной транзакцией». Он действительно не удаляется до тех пор, пока транзакция, которая удалила строку, не зафиксировалась ... и даже тогда она могла бы удалить и снова вставить строку или другую параллельную транзакцию, возможно, снова вставила строку.
Вы создаете очередь задач или систему очереди сообщений случайно, потому что если это так, эта проблема решена, и вы не должны пытаться изобрести это необычно сложное колесо. См. PGQ, ActiveMQ, RabbitMQ, ZeroMQ и т. Д. (Будущие версии PostgreSQL may include FOR UPDATE SKIP LOCKED
, поскольку это тестируется, но не было выпущено на момент написания).
Предлагаю вам опубликовать новый вопрос с более подробным описанием основной проблемы, которую вы пытаетесь решить. Вы предполагаете, что решение вашей проблемы - «выяснить, была ли строка удалена» или «разблокировать строку». Вероятно, это не решение. Это немного похоже на то, что кто-то говорит: «Где я покупаю бензин», когда их толкающий байк не идет, поэтому они считают, что это из-за топлива. Топливо не проблема, проблема в том, что нажимные велосипеды не принимают топливо, и вы должны их педали.
Объясните фон. Объясните, чего вы пытаетесь достичь. Прежде всего, не размещайте псевдокод, пост фактический код, который у вас возникает с, желательно в автономной и исполняемой форме.
Этот вопрос и ваш последний [здесь] (http://stackoverflow.com/questions/15726009/some-questions-about-select-for-update) заставляют меня думать, что вы ничего не знаете о блокировке SQL не говоря уже о варианте PostgreSQL. Для PostgreSQL вы должны прочитать полную главу о [MVCC Concurrency Control] (http://www.postgresql.org/docs/current/interactive/mvcc.html). –