首页 > 解决方案 > 事务不工作(Manager tx 问题)

问题描述

再会!我的问题是,当我将另一个数据库的配置从 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 = "transactionManagerYarus") 如果我使用 xml Transactional 构建项目可以正常工作但是如果使用@Bean 构建它就不起作用...

请帮帮我!

我用

1) 弹簧 4.3

2) MyBatis

3)Postgesql

4)Java 8

标签: javaspringspring-transactionsspring-mybatis

解决方案


我们也找到解决方案。问题出在数据源中

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

它是我的 bean,我称这个 bean 为类似方法,例如

     new DataSourceTransactionManager(dataSourceYarus());

我对此并不重视,因为在所有示例中都是如此。但是在 xml 配置中导致这个名字像“Bean”,我将 java-config 中的调用替换为

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

和....这对我有用!因为如果调用这个方法,每次创建新池然后事务就结束了


推荐阅读