Я пытаюсь создать сценарий Ruby, который порождает несколько параллельных дочерних процессов, каждый из которых должен обращаться к одному и тому же хранилищу данных (очереди какого-либо типа) и что-то делать с данными.Проблема заключается в том, что каждая строка данных должна обрабатываться только один раз, и дочерний процесс не может узнать, может ли другой дочерний процесс работать с теми же данными в одно и то же время.
Я не выбралхранилища данных пока нет, но я склоняюсь к PostgreSQL просто потому, что это то, к чему я привык.Я видел следующий фрагмент SQL, предложенный как способ избежать состояния гонки, потому что предложение UPDATE предположительно блокирует строку таблицы до того, как произойдет SELECT:
UPDATE jobs
SET status = 'processed'
WHERE id = (
SELECT id FROM jobs WHERE status = 'pending' LIMIT 1
) RETURNING id, data_to_process;
Но будет ли это действительно работать?Не кажется интуитивно понятным, что Postgres (или любая другая база данных) могли заблокировать строку таблицы перед выполнением SELECT, поскольку необходимо выполнить SELECT, чтобы определить, какую строку таблицы необходимо заблокировать для обновления.Другими словами, меня беспокоит, что этот фрагмент SQL не помешает двум отдельным процессам выбирать и работать в одной строке таблицы.
Я параноик?И есть ли лучшие варианты, чем традиционные РСУБД, для обработки ситуаций параллелизма, подобных этой?