Sobes.tech
Senior

10 aplikacija za obradu preuzimaju zadatke iz baze podataka. Kako sprečiti da dve instance preuzmu isti zadatak?

sobes.tech АИ

Одговор од АИ

Чтобы избежать ситуации, когда два приложения одновременно забирают одну и ту же задачу из базы данных, нужно обеспечить атомарность операции выбора и блокировки задачи. Один из распространённых подходов — использовать транзакции с блокировкой строк или обновлением статуса задачи.

Например, можно сделать так:

  1. В таблице задач добавить поле status (например, "new", "processing", "done").
  2. При выборе задачи для обработки выполнить запрос, который атомарно обновит статус задачи с "new" на "processing" и вернёт обновлённую строку.

Пример на SQL (PostgreSQL):

UPDATE tasks
SET status = 'processing'
WHERE id = (
    SELECT id FROM tasks WHERE status = 'new' LIMIT 1 FOR UPDATE SKIP LOCKED
)
RETURNING *;

Здесь FOR UPDATE SKIP LOCKED позволяет другим транзакциям пропускать уже заблокированные строки, что предотвращает двойное взятие одной задачи.

В Java можно использовать JDBC и транзакции для выполнения такого запроса. Это гарантирует, что каждая задача будет обработана ровно одним приложением-обработчиком.