Java синхронизирована против более строгого уровня изоляции БД? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть веб-сервис Spring Boot с некоторым методом, который выполняет get-from-DB, за которым следует вставка, если не присутствует (с некоторой логикой между ними, которую я бы сейчас предпочел оставить в Java). Метод аннотирован @Transactional, но, конечно, с уровнем изоляции по умолчанию (чтение зафиксировано), возможно, что одна и та же строка будет вставлена ​​дважды, если два запускаются параллельно. Если я изменю уровень изоляции на сериализуемый, то получу снижение производительности. Будет ли лучше использовать обычную синхронизацию Java и синхронизировать глобальный объект, который уникально представляет запрашиваемый / добавленный элемент? По сути, я бы интернировал строковый параметр, передаваемый методу, который представляет какое-то имя элемента, и синхронизировался с этим. Очевидно, я не смогу масштабировать по горизонтали, но давайте предположим, что этот экземпляр веб-службы является единственным клиентом БД.

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Добавить уникальное ограничение для вставленных данных. Таким образом, вы не сможете вставить одни и те же данные дважды.

0 голосов
/ 15 марта 2019

Если вы можете быть уверены, что веб-служба является единственным клиентом и что только один экземпляр запущен, то Synchronized выполнит эту работу отлично, но это не очень хорошая практика, и вам лучше использовать строгую изоляцию БД, даже реализуя проверки когерентности иУровень БД

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