Как работает распределенная блокировка, если информация о базе данных загружается в память JVM до завершения блокировки?

#java #database #redis #locking #distributed-system

#Ява #База данных #редис #запирающийся #распределенная система

Вопрос:

Меня назначили на новый проект, и я обнаружил это:

Планировщик должен взять несколько строк из базы данных(на основе флага), обновить некоторую информацию о них и после этого снова сохранить ее в базе данных. После извлечения информации в виде списка каждый элемент списка передается методу(назовем его «ProcessData»), который выполняет определенную обработку. Тело метода получает блокировку из реестра Redislock на основе идентификатора MessageDb, выполняет определенную обработку и, наконец, снимает блокировку.

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

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

Из моего понимания того, как работают замки, это будет выглядеть так:

  1. Оба экземпляра приложения(I1, I2) извлекают одни и те же данные одновременно со списком
  2. И I1, и I2 вызывают метод «ProcessData()» для каждого элемента полученного списка (помните тело ProcessData (): получение блокировки, обработка, разблокировка).
  3. Предположим, что I1 удается получить блокировку для одного из элементов, он выполняет обработку, обновляет элемент в базе данных и разблокирует.
  4. I2 получает блокировку для того же элемента с тех пор, как I1 освободил его, и теперь он может вносить изменения. Но как будут внесены изменения, так как теперь состояние элемента в базе данных отличается от состояния элемента, который находится в памяти I2 (из-за обновления I1)

Комментарии:

1. Как правило, l2 запускается снова с нуля.

2. Это то, что мы должны делать. Но поскольку данные уже находятся в памяти, как он узнает, что в базе данных были сделаны некоторые обновления для тех же данных, которые сейчас обрабатываются I2?

3. База данных должна организовывать операции в транзакциях , где l2 должна проверять, под замком, что ее считывания все еще действительны.