Как обеспечить изоляцию параллелизма в приложении Spring с использованием шаблона jdbc - PullRequest
0 голосов
/ 04 ноября 2019

Я использую spring и jdbctemplate. (без спячки). У меня есть таблица со статусом.

Если статус ОТКРЫТ, его можно ЗАКРЫТЬ, и будет выполнена определенная обработка. Но его можно закрыть только один раз.

Теперь у меня возникла ситуация, когда несколько потоков или запросов могут приходить в один и тот же блок кода, где я проверяю состояние строки.

T data = getJdbcTemplate().query()...
// Multiple request/threads can come here at same point. 
if ( data.getStatus() == "OPEN"){
   // business logic
}

Как я могу справиться с таким сценарием?

1 Ответ

1 голос
/ 04 ноября 2019

если вы используете что-то вроде mysql или pgsql, то вы можете сделать:

   UPDATE table WHERE id="id" AND status = "OPEN"

и проверить количество затронутых строк (из JdbcTemplate.upate ()). Например, mysql и mariadb гарантируют, что это обновление произойдет только один раз. второй параллельный поток получит ноль обновленных строк.

затем вы можете выполнить свою обработку.


edit:

Такое поведение является частью того, что гарантирует СУРБД (см., Например, https://en.wikipedia.org/wiki/ACID)

Кроме того, если вы 'повторение того, что происходит, когда обработка завершается неудачно - я обычно использую шаблон для установки статуса на что-то вроде «В ОЖИДАНИИ», возможно, также устанавливаю там дату и сбрасываю состояние, если оно застряло в «ОЖИДАНИИ» слишком долго. конечно, может быть изменен, чтобы быть отмеченным, чтобы пройти некоторую ручную проверку при необходимости.

...