Короткий ответ заключается в том, что для этого не существует «простого рецепта», как и готового решения от Hibernate или любой другой инфраструктуры ORM.
Длинный ответ:
Вам нужно будет выяснить, как реализовать некоторые функции, которые позволят вашему приложению имитировать поведение блокировки базы данных для вашего «долгого разговора».
Самое важное - убедиться, что после того, как пользователь начнет использовать часть информации (строку базы данных или набор объектов, в зависимости от вашего случая), эта информация не будет использоваться / обрабатываться другим пользователем. Также вам нужно убедиться, что у вас есть какая-то политика по раскрытию информации, либо когда пользователь завершает операцию, либо по прошествии определенного времени (вам не нужна вечная блокировка вашей информации).
Поскольку я не знаю подробностей о вашем приложении, я приведу абстрактный пример, который может послужить источником вдохновения для вашего случая. Конечно, это не единственное решение.
Пожалуйста, имейте в виду, что каждый шаг будет содержаться в одной транзакции, потому что, в конце концов, ваш долгий разговор будет серией запросов в вашем веб-приложении.
Кроме того, предполагая информацию из тегов вопросов, этот ответ нацелен на решение в простом веб-приложении, которое подключается к БД. Никакой "навороченной экзотики" архитектуры.
В данной таблице, которая нуждается в таком управлении, добавьте 2 столбца: один будет идентификатором пользователя, а другой - меткой времени. Это будет контролировать, у кого есть «блокировка» в строке, и время, когда она была получена.
Когда пользователь начинает использовать данные, содержащиеся в строке таблицы, ваше приложение обновит строку, указав идентификатор пользователя и текущую дату / время. Это наиболее важный шаг, потому что вам придется правильно работать с параллелизмом. Если несколько пользователей пытаются получить «блокировку» строки, ваше приложение должно разрешить блокировку для только одного пользователя. На этом шаге, скорее всего, потребуется использовать блокировку базы данных в одной транзакции. Убедитесь, что этот шаг выполняется быстро и не связан с другими операциями, чтобы блокировка базы данных не оказала большого влияния на ваше приложение.
После того, как пользователь закончил манипулировать данными, приложение может просто изменить идентификатор пользователя и временную метку на null, и после этого другой пользователь сможет их использовать.
Если пользователь по какой-то причине не выполнил задачу, вам придется применить какую-то политику «освобождения». В простых случаях простое истечение времени решит эту проблему. Если данный пользователь пытается получить «блокировку» для строки, которая уже имеет блокировку, ваше приложение проверит метку времени. Если метка времени истекла, новый пользователь отменяет блокировку. В противном случае строка недоступна.
Есть и другие более сложные сценарии. Если во время вашего процесса информация в базе данных изменяется до полного завершения операции (допустим, пользователь вносит различные изменения в информацию, и они отправляются в базу данных до того, как пользователь завершит операцию и «отпустит» строку), возможно вам нужно будет выяснить, как реализовать откат. Может быть, оставить данные «наполовину обработанными» - это нормально, а может и нет, это зависит от потребностей вашего бизнеса.
Короче говоря:
Хорошо подумайте, применим ли какой-либо из этих советов к вашему сценарию.
Я надеюсь, что это было полезно.
person
Vitor Santos
schedule
05.02.2019