Блокировка таблицы SQL и ожидание освобождения блокировки — Java

#sql #spring #transactions #spring-transactions

#sql #spring #транзакции #весенние транзакции

Вопрос:

Я хочу выполнить функцию, которая блокирует таблицу / строку? , проверяет, существует ли запись (с определенными критериями) или нет, и создает запись, если она не существует.

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

Как я могу этого добиться?

РЕДАКТИРОВАТЬ 1: подробное объяснение моей цели :-

Шаг 1: Экземпляр микросервиса 1 блокирует таблицу, выполняет процедуру / транзакцию

Шаг 2: внутри процедуры / транзакции проверьте, существует ли запись, если да, верните true и снимите блокировку, если нет, создайте запись и снимите блокировку.

Шаг 3: Во время выполнения шага 2 другой экземпляр микросервиса B пытается получить доступ к таблице (т.Е. параллельный запрос), но поскольку он заблокирован, экземпляр B будет ждать, пока экземпляр A не снимет блокировку.

шаг 4: После того, как экземпляр A снимает блокировку, экземпляр B переходит к шагу 2.

Может быть 5-7 одновременных запросов.

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

1. Вы хотите выполнить какую-либо процедуру db после снятия блокировки или вы хотите убедиться, что некоторый java-код выполняется только один раз?

2. @Krzysztof — Я подробно добавил свое требование.. я мог получать одно и то же сообщение несколько раз .. поэтому я пытаюсь достичь идемпотентности с помощью механизма кэширования.

3. Я пытаюсь добиться этого: microservices.io/patterns/communication-style /…

Ответ №1:

Извините, если я что-то упускаю из виду в отношении цели, которую вы хотите достичь, но вместо того, чтобы пытаться использовать такой механизм распределенной блокировки, возможно, альтернативным решением будет использование какого-либо брокера сообщений, в который разные микросервисы будут публиковать сообщения, с одним потребителем, который будет обрабатывать их с учетом возможных ошибок.дубликаты. Это правда, что с определенными ограничениями, но такие сервисы, как Kafka или RabbitMQ, например, гарантируют упорядочение сообщений.

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

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