| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Spring и глобальные транзакции |
| Автор: 4epT 26.12.2012, 17:15 | ||||||
| Всем привет. Читаю насчет транзакций в спринге, понял что есть два типа: локальные (в пределах одного транзакционного ресурса) и глобальные (несколько транзакционных ресурсов). В моем случае нужно использовать глобальные транзакции. У меня в пределах одной транзакции идет работа с mongodb, redis и rabbitmq. Объявляю бины:
Добавил tx:annotation-driven:
Приложение стартует нормально. Специально тушу rabbit (то есть упадет эксепшен Connection refused). Изменения не откатываются. Метод помечен как:
|
| Автор: MisterCleric 26.12.2012, 17:35 | ||
| Привет. А этот Exception Runtime? Только Runtime приводят к автоматическому ролл-бэк транзакции И как-то ты все сложновато настроил. Может этого будет достаточно:
Где первый создас бин типа JtaTransactionManager с имененм "transactionManager" А второй сдеай, то что ты уже знаешь: разрешит использовать @Transactional Но все это будет работать, если ты подымаешь свое приложение под сервером прложений: JBOSS, WAS, WebLogic. Или давай не так: что это за классы: UserTransactionManager, UserTransactionImp? |
| Автор: 4epT 26.12.2012, 17:42 | ||
| Эксепшен не Runtime ) может быть в этом и проблема. У меня весь конфиг спринга вынесен из xml (xml не использую вообще), можно эти (<tx:jta-transaction-manager/> <tx:annotation-driven/>) настройки прописать аннотациями ? или вынести в xml и сделать @ImportResource ? Используется jetty.
Это из atomikos. |
| Автор: MisterCleric 26.12.2012, 17:50 | ||||
и
Тогда все нормально: пусть будет в аннотациях. Так что там у тебя с Runtime? Не в тему: а как используешь Srping Integration без XML |
| Автор: 4epT 26.12.2012, 17:56 | ||
Выкинул Runtime эксепшен, картина не изменилась, данные из базы не подчистились.
Ну для mongodb использую SpringData, то есть mongoTemplate и SimpleMongoDbFactory. Для redis использую jedis и его конфигурацию через Spring. Или это не Spring integration ? |
| Автор: MisterCleric 26.12.2012, 18:05 | ||||
Ты же всем своим ресурсам должен указать один и тот же transactionManager... Не достаточно просто @Transactional. Все эти ресурсы должны знать в рамках, какого transactionManager жевет ихняя транзакция. Иначе они сами за тебя это решат в рамках своих локльных транзакционных вохможностей.
Нет. Я тебе в предыдущей теме давал ссылку |
| Автор: 4epT 26.12.2012, 18:47 | ||||
Ну для локальных транзакций там прописывается dataSource к которому "принадлежит" этот transactionManager, а для глобальных я читал что просто объявляется JtaTransactionManager и все ... Как тогда прописать моим ресурсам transactionManager ? если я правильно понял, то ресурсы это mongodb, redis и rabbimq ? Ну и к слову я сейчас вообще сильно сомневаюсь в надобности использования JTA, так как говорят что производительность из за этого очень сильно скачет, легче уже тогда енаписать свой rollback...
Да, то я не правильно посмотрел в первый раз ... теперь понял что имеется ввиду. В начале смотрел на это, но потом как то забыл, нужно будет еще раз глянуть ) |
| Автор: MisterCleric 26.12.2012, 20:25 |
| Где у тебя проблема с ролл-бэком? Основная парадигма, что все NoSQL не поддерживают транзакции Но по Mongo вот, что я нашел: http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ |
| Автор: 4epT 26.12.2012, 21:57 | ||||
Проблема в том что ролбек не работает ) и это наверное из за:
так что наверное напишу свою реализацию ролбек и все. И кстати, ведь при объявлении бина JtaTransactionManager, ему не нужно прописывать ресурсы с какими он работает, почему тогда:
Допустим я использую SQL решения, мне нужно будет моим dataSource прописывать transactionManager ? |