Как вы можете использовать «Для блокировки пропуска обновления» в postgres без блокировки строк во всех таблицах, используемых в запросе?

Если вы хотите использовать функцию postgres SELECT FOR UPDATE SKIP LOCKED, чтобы гарантировать, что два разных пользователя, читающие из таблицы и запрашивающие задачи, не блокируются друг другом, а также не получают задачи, уже прочитанные другим пользователем:

Соединение используется в запросе для получения задач. Мы не хотим, чтобы какие-либо другие таблицы имели блокировку на уровне строк, кроме таблицы, содержащей основную информацию. Пример запроса ниже — заблокируйте только строки в таблице — «задача» в приведенном ниже запросе

SELECT v.someid , v.info,  v.parentinfo_id, v.stage  FROM task v, parentinfo pi  WHERE v.stage = 'READY_TASK' 
             AND v.parentinfo_id = pi.id 
             AND pi.important_info_number = ( 
             SELECT MAX(important_info_number) FROM parentinfo )
              ORDER BY v.id limit 200 for update skip locked;

Теперь, если пользователь A извлекает около 200 строк этой таблицы, пользователь B должен иметь возможность получить еще один набор из 200 строк.

РЕДАКТИРОВАТЬ: В соответствии с приведенным ниже комментарием запрос будет изменен на:

SELECT v.someid , v.info,  v.parentinfo_id, v.stage  FROM task v, parentinfo pi  WHERE v.stage = 'READY_TASK' 
             AND v.parentinfo_id = pi.id 
             AND pi.important_info_number = ( 
             SELECT MAX(important_info_number) FROM parentinfo)  ORDER BY v.id limit 200 for update of v skip locked;

Как лучше разместить порядок таким образом, чтобы строки были упорядочены? Хотя порядок будет выполнен, если несколько пользователей вызовут эту команду, все же должна поддерживаться некоторая неприкосновенность порядка возвращаемых строк.

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


person Righto    schedule 16.07.2017    source источник
comment
Документ: FOR lock_strength [ OF table_name [, ...] ] [ NOWAIT | SKIP LOCKED ] ... Если в предложение блокировки, тогда блокируются только строки, поступающие из этих таблиц; любые другие таблицы, используемые в SELECT, просто читаются как обычно.   -  person Abelisto    schedule 16.07.2017


Ответы (1)


Просто немного поэкспериментировал с этим - несколько запросов на выборку в конечном итоге будут извлекать разные наборы строк. Кроме того, order by обеспечивает порядок конечного результата.

person Righto    schedule 17.07.2017