Работает ли Spring @transactional с MongoDB?

Я разрабатываю веб-приложение с Spring Boot и MongoDB. Я хочу, чтобы службы работали с аннотацией @transactional spring, но я не знаю, действительно ли это работает. (Раньше я не работал с mongoDB).

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

В другом посте я видел, что должен добавить новый bean-компонент в класс конфигурации, чтобы включить транзакцию между Spring и MongoDB. Это действительно необходимо? Я использую транзакции только с отдельными документами Mongo.

Справочное руководство Spring Data MongoDB, §12.2: Транзакции с MongoTransactionManager (внешняя ссылка)
Turing85 10.03.2019 12:33

@ Turing85, который не работает с весенней загрузкой. Если я создам bean-компонент transactionManager, я не смогу импортировать тип MongoTransactionManager. Этот тип находится в библиотеке «spring-data-mongodb», а я использую «spring-boot-starter-data-mongodb». Если я добавлю в проект первую зависимость, исключение ClassNotFoundException будет выполнено.

tovarichML 10.03.2019 12:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
2
8 785
2

Ответы 2

@Transactional работает только с spring-data-mongodb версии 2.1.0 и выше: https://docs.spring.io/spring-data/mongodb/docs/2.1.0.RELEASE/api/

Действительно, вы должны добавить bean:

@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
}

Я не знаю, игнорирует ли Spring аннотацию и работает как обычно, или действительно учитывает транзакцию.

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

Но если вы используете транзакции в одном документе Mongo, вам не нужна аннотация @Transactional:

In MongoDB, a write operation is atomic on the level of a single document, even if the operation modifies multiple embedded documents within a single document. MongoDb documentation - Transactions

Я рекомендую ArithmeticException: / нулем, между 2 вставками db. получилось проверить операцию отката. MongoDbFactory устарела, теперь используйте MongoDatabaseFactory

Musculaa 05.06.2021 06:08

Для интеграции mongoDB и Spring в реактивном стиле ответ, который я предоставил здесь, может быть полезен людям.

Другие вопросы по теме