Когда происходит блокировка и разблокировка "выбрать для обновления"?

Вот мой псевдокод:

re = [select **result** from table where **condition**=key for update]

if[re satisfies]
{
    delete from table where **condition** = key;
}

commit

Я хочу спросить, была ли строка с условием равным "ключу" уже удалена. Можно ли автоматически блокировать блокировку блокировки "выбрать для обновления", что означает, что если в этот момент входит другой процесс и выберите такой же "ключ" он не может быть заблокирован этим?

Ответ 1

Заблокировки выполняются во время (обычно в начале или в начале) выполнения команды. Замки (кроме консультативные блокировки) освобождаются только тогда, когда транзакция совершает или откатывается. Нет FOR UNLOCK, и нет команды UNLOCK для изменения эффектов команды LOCK на уровне таблицы. Все это объясняется в разделе управления concurrency документации PostgreSQL.

Вы должны зафиксировать или отменить транзакцию для освобождения блокировок.

Кроме того, на самом деле не имеет смысла спрашивать "эта строка уже удалена другой параллельной транзакцией". Это действительно не удаляется до тех пор, пока транзакция, удаляющая строку, не зафиксируется... и даже тогда она могла бы удалить и повторно вставила строку или другую параллельную транзакцию, возможно, снова вставила строку.

Создаете ли вы очередь задач или систему очереди сообщений, потому что если это так, эта проблема решена, и вы не должны пытаться изобрести это необычно сложное колесо. См. PGQ, ActiveMQ, RabbitMQ, ZeroMQ и т.д. (Будущие версии PostgreSQL может включать FOR UPDATE SKIP LOCKED, поскольку он тестируется, но не был выпущен во время написания).

Я предлагаю вам опубликовать новый вопрос с более подробным описанием основной проблемы, которую вы пытаетесь решить. Вы предполагаете, что решение вашей проблемы - "выяснить, была ли строка удалена" или "разблокировать строку". Вероятно, это не решение. Это немного похоже на то, что кто-то говорит "Где я покупаю бензин", когда их толчок-байк не уходит, поэтому они принимают его за топливо. Топливо не проблема, проблема в том, что нажимные велосипеды не берут топливо, и вы должны их педали.

Объясните фон. Объясните, чего вы пытаетесь достичь. Прежде всего, не отправляйте псевдокод, отправляйте фактический код, с которым у вас возникают проблемы, предпочтительно в автономной и исполняемой форме.