Итак, чтобы объяснить это, я начну с просмотра стека приложений.
Система запускает JSP с jQuery сверху, общаясь через уровень контроллера с уровнем обслуживания, который, в свою очередь, использует уровень персистентности, реализованный в Hibernate.
Теперь, традиционно, ошибки, такие как наложение контрактов, обрабатываются путем выброса исключений через слои, пока они не преобразуются в сообщение об ошибке для пользователя.
Теперь у меня есть объект, который в любой момент времени может быть привязан только к одному контракту. В тот момент, когда я сохраняю контракт, я смотрю на все эти объекты и проверяю, охватывается ли они уже существующим контрактом. Однако, поскольку несколько клиентов могут экономить в любой момент времени, это создает риск преодоления проверки двух отдельных контрактов, что приводит к тому, что один объект привязывается к двум контрактам одновременно.
Для борьбы с этим идея состояла в том, чтобы использовать очередь, помещать объекты в очередь из основного потока, а затем заставить отдельный поток извлекать их один за другим, сохраняя их.
Однако вот в чем проблема. С одной стороны, я хотел бы, чтобы пользователь знал, что в данный момент происходит сохранение, с другой - если случайно произошел предыдущий сценарий, и два контракта с одним и тем же объектом, охватывающим одно и то же время, находятся в очереди, второй сбоит, и это нужно отправить обратно пользователю.
Моя первоначальная попытка состояла в том, чтобы сохранить поля данных для объекта, помещенного в очередь, а затем проверить их в ожидании блокировки, а затем выдать исключение или сообщить об успехе на основе того, что происходит. Это полностью заблокировало систему.
Кто-нибудь может указать мне правильное направление в отношении техник и схем, которые я должен использовать для этого?