если вы используете что-то вроде mysql или pgsql, то вы можете сделать:
UPDATE table WHERE id="id" AND status = "OPEN"
и проверить количество затронутых строк (из JdbcTemplate.upate ()). Например, mysql и mariadb гарантируют, что это обновление произойдет только один раз. второй параллельный поток получит ноль обновленных строк.
затем вы можете выполнить свою обработку.
edit:
Такое поведение является частью того, что гарантирует СУРБД (см., Например, https://en.wikipedia.org/wiki/ACID)
Кроме того, если вы 'повторение того, что происходит, когда обработка завершается неудачно - я обычно использую шаблон для установки статуса на что-то вроде «В ОЖИДАНИИ», возможно, также устанавливаю там дату и сбрасываю состояние, если оно застряло в «ОЖИДАНИИ» слишком долго. конечно, может быть изменен, чтобы быть отмеченным, чтобы пройти некоторую ручную проверку при необходимости.