Транзакция не работает (менеджер TX проблема) - PullRequest
0 голосов
/ 15 января 2019

Добрый день! Моя проблема заключается в том, что когда я перенес конфигурацию для другой БД из XML в @Bean, мои транзакции теряются .... не выполняется откат и не работает. Я вижу это, когда в БД после первой вставки создается строка (!), Но в этом методе (транзакции) запускается вторая вставка, я беру исключение и строку после первой вставки остается в БД!

Это xml

<bean name="sqlSessionFactoryYarus" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="/WEB-INF/MapperConfigYarus.xml" />
    <property name="dataSource" ref="dataSourceYarus" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="ru.project.crm.mapper_yarus"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryYarus" />
</bean>

<bean id="transactionManagerYarus"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceYarus" />
    <qualifier value="yarus"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManagerYarus"  />

этот код (dataSource нет этого, чтобы не терять места)

 @Component
 @Scope("singleton")
 @DependsOn("springApplicationContextHolder")
 public class YarusConnectionConfig {
@Bean
public SqlSessionFactory sqlSessionFactoryYarus() throws Exception {
    SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
    sqlSessionFactory.setDataSource(dataSourceYarus());
    sqlSessionFactory.setConfigLocation(new ClassPathResource("../MapperConfigYarus.xml"));
    return sqlSessionFactory.getObject();
}

@Bean
public MapperScannerConfigurer yarusMapper() throws Exception {
    MapperScannerConfigurer msc = new MapperScannerConfigurer();

    msc.setSqlSessionFactoryBeanName("sqlSessionFactoryYarus");
    msc.setBasePackage("ru.project.crm.mapper_yarus");
    return msc;
}
@Bean
public DataSourceTransactionManager transactionManagerYarus() throws Exception {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSourceYarus());
    return dataSourceTransactionManager;
}
}

А

Все шаги, когда я хочу, чтобы Транзакционная аннотация @Transactional (value = "TransactionsManagerYarus") И если я строю проект с XML Transactional работает нормально НО, если сборка с @Bean не работает ...

Plesae Помоги мне!

Я использую

1) Пружина 4.3

2) MyBatis

3) Postgesql

4) Java 8

1 Ответ

0 голосов
/ 01 февраля 2019

Также мы находим решение. Проблема была в источнике данных

@Bean(destroyMethod = "close", name = "dataSourceYarus")
public ComboPooledDataSource dataSourceYarus()  {
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    //config connection
}

Это мой компонент, и я вызываю этот метод, подобный компоненту, например

     new DataSourceTransactionManager(dataSourceYarus());

Я не придавал этому значения, потому что во всех примерах это правда. НО в конфигурации xml это вызвало как "Bean" на его имени, я заменяю вызов в java-config на

     new DataSourceTransactionManager(context.getBean("dataSourceYarus"))

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

...