java - SpringBoot,手动控制两个数据源,事务失败

标签 java spring-boot transactions

我使用的是SpringBoot 2.1.8.RELEASE,我有两个数据源,我手动控制事务。 事务(标记为“@Primary”)有效。但是,标记另一个数据源的事务无法正常工作。 您有什么建议吗?

Maven配置如下

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

other omit...

一个数据源配置如下:

@Configuration
@MapperScan(basePackages = {"com.XXX.XXXX.mapper","com.XXX.XXX.common.mapper"},sqlSessionFactoryRef = "masterSqlSessionFactory")
public class ProductDataSourceConfig {
    static final String MAPPER_LOCATION = "classpath:mybatis/MYSQL/*.xml";


    @Bean(name = "masterDataSource")
    @ConfigurationProperties("spring.datasource.product")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")

    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(ProductDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

另一个数据源配置如下:

@Configuration
@MapperScan(basePackages = "com.XXX.XXX.mapperTest",sqlSessionFactoryRef = "secondSqlSessionFactory")
public class TestDataSourceConfig {
    static final String MAPPER_LOCATION = "classpath:mybatis/TESTMYSQL/*.xml";

    @Primary
    @Bean(name = "secondDataSource")
    @ConfigurationProperties("spring.datasource.test")
    public DataSource clusterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Primary
    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(TestDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

配置如下后,按预期提交(在“@Primary”数据库中,插入记录)。

@Autowired
DataSourceTransactionManager dataSourceTransactionManager;

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setTimeout(500);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);

insertTmemberEnterRecord(bean);

dataSourceTransactionManager.commit(transactionStatus);

但是如下配置,提交不起作用(没有数据插入表),也没有错误信息。

@Qualifier("masterTransactionManager")
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setTimeout(500);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);

insertTmemberEnterRecord(bean);

dataSourceTransactionManager.commit(transactionStatus);

欢迎任何建议。

最佳答案

我解决了这个问题。 原因是还应该使用相应的mapper文件。

关于java - SpringBoot,手动控制两个数据源,事务失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60650538/

相关文章:

java - 无法在 Swing 中正确绘制自定义组件

java - 使用命令行和外部库在 ide 之外运行我的 jar 时出错

java - 如何从 apache tomcat 中的 URL 中删除应用程序上下文

java - 限制 CrudRepository 中的创建操作,仅允许编辑操作

sql - PostgreSQL 是否保证两个同时提交的 `commit timestamp` 的唯一性?

mysql - 单个更新查询所需的事务?

java - 仅当记录因数据修改而更新时才更新日期

java - 为什么 Controller 需要在绑定(bind)错误上添加模型

java - 无法使用 mvn clean deploy 从同一台计算机将 Artifact 上传到 Nexus,在我的本地 Windows 10 计算机上工作正常

c# - 使用 linq to sql 中的方法属性处理事务上下文