Заблокируйте строку в базе данных и освободите ее позже

#spring-boot #spring-mvc #spring-data-jpa #spring-data #locking

#весенняя загрузка #spring-mvc #spring-data-jpa #весна-данные #блокировка

Вопрос:

У меня есть следующий вариант использования —

  1. Пользователь регистрируется и заполняет данные в форме. Пользовательские данные хранятся в БД под таблицей с надписью «user».
  2. Администраторы входят в приложение. Проверьте пользовательские данные и включите пользователя.

Здесь требуется заблокировать пользовательские данные от любых дальнейших операций обновления или удаления и разрешить только операции чтения. Мы снимаем блокировку пользовательских данных только тогда, когда данные пользователя будут одобрены администратором.

Я исследовал пессимистическую блокировку весенней загрузки. Однако это не соответствует приведенному выше варианту использования, поскольку я разрешу блокировку и освобождение в рамках одной транзакции. Есть ли у нас какая-либо функция в Spring boot, чтобы заблокировать строку таблицы, а затем освободить ее позже?

Или есть способ реализовать рабочий процесс с использованием Spring boot?

Ответ №1:

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

Это совсем не ваш случай.

  1. Вы можете создать пользователя в отдельной таблице и скопировать его в основную таблицу после утверждения.
  2. Просто добавьте столбец флага для пользователя и не разрешайте обновления, если флаг false .

Ответ №2:

Вам следует взглянуть на Spring Content проекта сообщества.

Этот проект содержит модуль под названием Spring Versions JPA, который позволяет вам добавлять семантику блокировки и управления версиями к вашей сущности JPA, которую вы описываете. Это очень распространенный вариант использования в приложениях управления контентом (для обслуживания которого предназначен контент Spring). Вы можете прочитать больше об этом здесь.

Он был разработан как отдельный модуль, который можно было бы использовать отдельно от основного проекта Spring Content, но я понятия не имею, действительно ли кто-нибудь использовал его таким образом, поэтому YMMV. Тем не менее, я был бы рад помочь вам в запуске, если у вас возникнут проблемы с нашим проектом на github. Это вероятно проще, чем писать эту логику самостоятельно.