Как использовать блокировки документов для предотвращения внешнего изменения записей во время транзакций Spring Data Mongodb - PullRequest
3 голосов
/ 24 мая 2019

У меня есть вопрос, касающийся Spring Data Mongo и Mongo Transactions.

Я успешно реализовал транзакции и проверил выполнение операций фиксации и отката, как и ожидалось, используя аннотацию Spring @Transactional.

Однако мне трудно заставить транзакции работать так, как я ожидал бы в среде Spring Data.

Spring data выполняет Mongo -> Java Object mapping.Таким образом, типичный шаблон для обновления чего-либо состоит в том, чтобы извлечь это из базы данных, а затем внести изменения, а затем сохранить это обратно в базу данных.До реализации транзакций мы использовали оптимистическую блокировку Spring, чтобы учесть возможность обновлений в записи между выборкой и обновлением.

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

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

Я знаю, что мог бы использовать методы mongodb findAndUpdate для выполнения своих обновлений, и это не позволило бы производить промежуточные изменения, но это противоречит стандартному шаблону Spring Data, который загружаетданные в объект Java.Таким образом, вместо того, чтобы просто манипулировать объектами Java, я должен был бы либо разбрасывать код, специфичный для монго, по всему приложению, либо создавать методы репозитория для каждого конкретного типа обновления, которое я хочу сделать.

Есть ли у кого-нибудь какие-либопредложения о том, как правильно справиться с этой ситуацией при сохранении парадигмы Spring Data о простом использовании объектов Java?

Заранее спасибо!

...