Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring и глобальные транзакции


Автор: 4epT 26.12.2012, 17:15
Всем привет. Читаю насчет транзакций в спринге, понял что есть два типа: локальные (в пределах одного транзакционного ресурса) и глобальные (несколько транзакционных ресурсов). В моем случае нужно использовать глобальные транзакции.

У меня в пределах одной транзакции идет работа с mongodb, redis и  rabbitmq.

Объявляю бины:

Код

@Bean
    public UserTransactionManager userTransactionManager(){
        UserTransactionManager userTransactionManager = new UserTransactionManager();
        return userTransactionManager;
    }

    @Bean
    public UserTransactionImp userTransactionImp(){
        return new UserTransactionImp();
    }

    @Bean
    public JtaTransactionManager jtaTransactionManager(){
        JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
        jtaTransactionManager.setTransactionManager(userTransactionManager());
        jtaTransactionManager.setUserTransaction(userTransactionImp());
        return jtaTransactionManager;
    }


Добавил tx:annotation-driven:

Код

@Configuration
@EnableTransactionManagement
public class SpringConfiguration {
...


Приложение стартует нормально. Специально тушу rabbit  (то есть упадет эксепшен Connection refused). Изменения не откатываются. Метод помечен как:

Код

@Transactional

Автор: MisterCleric 26.12.2012, 17:35
Привет.
А этот Exception Runtime? Только Runtime приводят к автоматическому ролл-бэк транзакции

И как-то ты все сложновато настроил.
Может этого будет достаточно:
Код

        <tx:jta-transaction-manager/>

    <tx:annotation-driven/>

Где первый создас бин типа 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.

Цитата

Или давай не так: что это за классы: UserTransactionManager, UserTransactionImp? 


Это из atomikos.

Автор: MisterCleric 26.12.2012, 17:50
Цитата

 или вынести в xml и сделать @ImportResource ?

и
Цитата

Это из atomikos. 

Тогда все нормально: пусть будет в аннотациях.

Так что там у тебя с Runtime?

Не в тему: а как используешь Srping Integration без XML  smile ?

Автор: 4epT 26.12.2012, 17:56
Выкинул Runtime эксепшен, картина не изменилась, данные из базы не подчистились.

Цитата

Не в тему: а как используешь Srping Integration без XML   ? 


Ну для mongodb использую SpringData, то есть mongoTemplate и SimpleMongoDbFactory.
Для redis использую jedis и его конфигурацию через Spring.

Или это не Spring integration ?

Автор: MisterCleric 26.12.2012, 18:05
Цитата

Выкинул Runtime эксепшен, картина не изменилась, данные из базы не подчистились.

Ты же всем своим ресурсам должен указать один и тот же transactionManager...
Не достаточно просто @Transactional. Все эти ресурсы должны знать в рамках, какого transactionManager жевет ихняя транзакция. Иначе они сами за тебя это решат в рамках своих локльных транзакционных вохможностей.

Цитата

Или это не Spring integration ?


Нет. Я тебе в предыдущей теме давал ссылку

Автор: 4epT 26.12.2012, 18:47
Цитата

Ты же всем своим ресурсам должен указать один и тот же transactionManager...
Не достаточно просто @Transactional. Все эти ресурсы должны знать в рамках, какого transactionManager жевет ихняя транзакция. Иначе они сами за тебя это решат в рамках своих локльных транзакционных вохможностей.


Ну для локальных транзакций там прописывается dataSource к которому "принадлежит" этот transactionManager, а для глобальных я читал что просто объявляется JtaTransactionManager и все ...

Как тогда прописать моим ресурсам transactionManager ? если я правильно понял, то ресурсы это mongodb, redis и rabbimq ?

Ну и к слову я сейчас вообще сильно сомневаюсь в надобности использования JTA, так как говорят что производительность из за этого очень сильно скачет, легче уже тогда енаписать свой rollback...

Цитата

Нет. Я тебе в предыдущей теме давал ссылку 


Да, то я не правильно посмотрел в первый раз ... теперь понял что имеется ввиду. В начале смотрел на это, но потом как то забыл, нужно будет еще раз глянуть )

Автор: MisterCleric 26.12.2012, 20:25
Где у тебя проблема с ролл-бэком?
Основная парадигма, что все NoSQL не поддерживают транзакции  smile 
Но по Mongo вот, что я нашел: http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

Автор: 4epT 26.12.2012, 21:57
Проблема в том что ролбек не работает ) и это наверное из за:

Цитата

Основная парадигма, что все NoSQL не поддерживают транзакции   


так что наверное напишу свою реализацию ролбек и все.


И кстати, ведь при объявлении бина JtaTransactionManager, ему не нужно прописывать ресурсы с какими он работает, почему тогда:

Цитата

Ты же всем своим ресурсам должен указать один и тот же transactionManager...
Не достаточно просто @Transactional. Все эти ресурсы должны знать в рамках, какого transactionManager жевет ихняя транзакция. Иначе они сами за тебя это решат в рамках своих локльных транзакционных вохможностей.


Допустим я использую SQL решения, мне нужно будет моим dataSource прописывать transactionManager ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)