如何在spring boot中使用带有jdbcTemplate的多个数据源的单个事务?

时间:2017-04-19 05:36:34

标签: java spring-boot transactions spring-jdbc jdbctemplate

如果在不同数据库中执行第二个更新语句时有任何错误,我需要回滚第一个语句。     我不想使用EntityManager,因为我已经在所有其他代码中使用了JdbcTemplate。     如果我使用带有限定符的@Transactional它可以很好地工作,但我希望@Transactional适用于这两个数据库。

我的代码段如下:

**DatasourceConfig.xml**
//Datasource for **DB2** database
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfigLmsDataSource" />
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
  scope="singleton" primary="true">
  <property name="dataSource" ref="dataSource" />
</bean> 

//Datasource for **Mysql** Database database
<bean id="dataSource1" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfigLmsDataSource1" />
</bean>

<bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource1"/>
</bean>

<bean id="transactionManager1"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
  scope="singleton" primary="true">
  <property name="dataSource" ref="dataSource1" />
</bean>


//Inside service class
**MyService.java**

@Autowired("jdbcTemplate")
JdbcTemplate jdbcTemplate;

@Autowired("jdbcTemplate1")
JdbcTemplate jdbcTemplate1;

@Transactional
public void modifyDB()
{
    jdbcTemplate.update("Update query for table in DB2 database");
    jdbcTemplate1.update("Update query for table in MySql database");
}

1 个答案:

答案 0 :(得分:0)

您需要一个全局事务管理器。您可以使用Spring的JtaTransactionManager

以下是教程:

http://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/