Цель Я хочу ввести управление транзакциями в моем источнике данных.
Ищете правильный способ использовать один и тот же экземпляр источника данных для диспетчера транзакций. Мое требование - указать в Java Config способ передачи «того же экземпляра» DS диспетчеру транзакций. Поправьте меня, если есть пробел в моем понимании.
В моем случае у меня есть источник данных типа autocommit false, и с помощью диспетчера транзакций, указанного ниже, я хочу зафиксировать / откатить транзакцию (например, обновить операцию / отменить операцию обновления --- когда есть ошибка / нет ошибки в сделке).
Однако во время отладки я заметил, что когда я использовал конфигурацию java, указанную ниже, я получаю два разных экземпляра источника данных, и trx.commit() не работает.
Программное управление транзакциями (https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch10s06.html)
@Bean
public DataSource dataSource() {
return getMyDataSource(); //new instance of datasource.//this datasource is autocommit-false
}
@Bean
public DataSourceTransactionManage trxManager() {
return getTransationManage(dataSource()); // this creates another instance of dataSource
}
Любая помощь в этом отношении приветствуется.
Редактировать :- Я использовал Mybatis с Spring. В принципе, мне пришлось правильно настроить DataSouce. Ссылки ниже были полезны.
[Pass parameters dynamically to Spring beans ][1] [Mybatis Transaction Management CTM and PTM ][2] [Spring Transaction Management Notes ][3] [Spring & JTA NOtes][4]
[1]: https://stackoverflow.com/a/21202458/5086633
[2]: http://www.mybatis.org/spring/transactions.html
[3]: https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch10s06.html
[4]: https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction
да. Эта форма объявления зависимостей @Bean происходит только в аннотированных классах @Configuration (как показано в docs.spring.io/spring/docs/3.0.0.M4/reference/html/…). См. Также stackoverflow.com/questions/40256702/…




Чтобы использовать тот же экземпляр dataSource, как насчет того, чтобы сделать это:
@Bean
@Autowired
public DataSourceTransactionManage trxManager(DataSource dataSource) {
return getTransationManage(dataSource);
}
Вам не нужно ничего передавать. Spring добавит bean в ваш параметр. И да, вам нужна аннотация @Configuration в классе. Пример: pastebin.com/cS7uutWr
Если вы столкнулись с multiple bean found of dataSource, переименуйте указанный выше bean-компонент dataSource в @Bean(name = "myDataSource") и измените имя параметра соответственно DataSource myDataSource.
Аннотирован ли класс, из которого вы скопировали этот код, с помощью @Configuration? Подтверждаю, не могли бы вы также включить определение класса и место создания контекста?