2013-04-01 5 views
12

Вот мой Псевдо-код:Когда блокировка и разблокировка «выбирают для обновления»?

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

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

commit 

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

+1

Этот вопрос и ваш последний [здесь] (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). –

ответ

21

Заблокировки выполняются во время (обычно в начале или в начале) выполнения команды. Замки (кроме 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, поскольку это тестируется, но не было выпущено на момент написания).

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

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

Смежные вопросы