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

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

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


person user1169587    schedule 05.02.2019    source источник


Ответы (1)


Короткий ответ заключается в том, что для этого не существует «простого рецепта», как и готового решения от Hibernate или любой другой инфраструктуры ORM.

Длинный ответ:

Вам нужно будет выяснить, как реализовать некоторые функции, которые позволят вашему приложению имитировать поведение блокировки базы данных для вашего «долгого разговора».

Самое важное - убедиться, что после того, как пользователь начнет использовать часть информации (строку базы данных или набор объектов, в зависимости от вашего случая), эта информация не будет использоваться / обрабатываться другим пользователем. Также вам нужно убедиться, что у вас есть какая-то политика по раскрытию информации, либо когда пользователь завершает операцию, либо по прошествии определенного времени (вам не нужна вечная блокировка вашей информации).

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

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

Кроме того, предполагая информацию из тегов вопросов, этот ответ нацелен на решение в простом веб-приложении, которое подключается к БД. Никакой "навороченной экзотики" архитектуры.

В данной таблице, которая нуждается в таком управлении, добавьте 2 столбца: один будет идентификатором пользователя, а другой - меткой времени. Это будет контролировать, у кого есть «блокировка» в строке, и время, когда она была получена.

Когда пользователь начинает использовать данные, содержащиеся в строке таблицы, ваше приложение обновит строку, указав идентификатор пользователя и текущую дату / время. Это наиболее важный шаг, потому что вам придется правильно работать с параллелизмом. Если несколько пользователей пытаются получить «блокировку» строки, ваше приложение должно разрешить блокировку для только одного пользователя. На этом шаге, скорее всего, потребуется использовать блокировку базы данных в одной транзакции. Убедитесь, что этот шаг выполняется быстро и не связан с другими операциями, чтобы блокировка базы данных не оказала большого влияния на ваше приложение.

После того, как пользователь закончил манипулировать данными, приложение может просто изменить идентификатор пользователя и временную метку на null, и после этого другой пользователь сможет их использовать.

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

Есть и другие более сложные сценарии. Если во время вашего процесса информация в базе данных изменяется до полного завершения операции (допустим, пользователь вносит различные изменения в информацию, и они отправляются в базу данных до того, как пользователь завершит операцию и «отпустит» строку), возможно вам нужно будет выяснить, как реализовать откат. Может быть, оставить данные «наполовину обработанными» - это нормально, а может и нет, это зависит от потребностей вашего бизнеса.

Короче говоря:

  • блокировка сделана из столбцов в таблице базы данных
  • ваш код управляет замком

  • пользователь пытается получить блокировку

  • если строка свободна или срок действия предыдущей блокировки истек, блокировка приобретается
  • после завершения операции блокировка стирается

Хорошо подумайте, применим ли какой-либо из этих советов к вашему сценарию.

Я надеюсь, что это было полезно.

person Vitor Santos    schedule 05.02.2019
comment
На этом шаге, скорее всего, потребуется использовать блокировку базы данных в одной транзакции, какой шаг этот? - person user1169587; 06.02.2019
comment
Когда пользователь начинает использовать данные, содержащиеся в строке таблицы, ваше приложение обновит строку, указав идентификатор пользователя и текущую дату / время. - шаг захвата захвата. - person Vitor Santos; 06.02.2019