交易无效(Manager TX问题)

时间:2019-01-15 10:18:54

标签: java spring spring-transactions spring-mybatis

美好的一天! 我的问题是,当我将另一个数据库的配置从xml转移到@Bean时,我的事务丢失了。...不回滚并且不起作用。 我在第一次插入后在数据库中创建行(!)后在数据库中看到了这一点,但是在此方法(事务)中开始第二次插入时,我出现了异常,并且在第一个插入后的行留在了DB上!

此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

1 个答案:

答案 0 :(得分:0)

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

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

这是我的bean,例如,我将这种bean称为方法

     new DataSourceTransactionManager(dataSourceYarus());

我对此并不重视,因为在所有示例中都是如此。 xml配置中的BUT在他的名字上引起了像“ Bean”这样的问题,我将java-config中的调用替换为

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

然后...。这对我有用! 因为如果调用此方法,则每次创建新池时事务都结束了