Java Spring中具有多个数据源的JTA事务
我必须在Spring中开发一个使用两个数据源的应用程序。这两个数据源应该由一个事务管理,这样,如果一个数据源中发生了一些异常,那么另一个数据源也应该回滚。我现在的问题是,我目前的jta植入不起作用。当我测试代码时,如果一个数据源有错误,另一个数据源不会回滚。它刚刚提交。 这是我的配置文件:Java Spring中具有多个数据源的JTA事务,java,spring,jta,Java,Spring,Jta,我必须在Spring中开发一个使用两个数据源的应用程序。这两个数据源应该由一个事务管理,这样,如果一个数据源中发生了一些异常,那么另一个数据源也应该回滚。我现在的问题是,我目前的jta植入不起作用。当我测试代码时,如果一个数据源有错误,另一个数据源不会回滚。它刚刚提交。 这是我的配置文件: <bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSour
<bean id="parentDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
abstract="true">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
</bean>
<bean id="firstDataSource" parent="parentDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
</bean>
<bean id="secondDataSource" parent="parentDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/test2"/>
</bean>
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
</bean>
<bean id="customerDAO" class="springapp.datasource.CustomerDAO">
<property name="dataSource">
<ref local="firstDataSource"/>
</property>
<property name="dataSource2">
<ref local="secondDataSource"/>
</property>
<property name="jtaTransactionManager">
<ref local="jtaTransactionManager"/>
</property>
</bean>
customerDAO中的交易代码为:
public class CustomerDAO {
private DataSource dataSource;
private DataSource dataSource2;
private JtaTransactionManager jtaTransactionManager;
public DataSource getDataSource2() {
return dataSource2;
}
public void setDataSource2(DataSource dataSource2) {
this.dataSource2 = dataSource2;
}
public JtaTransactionManager getJtaTransactionManager() {
return jtaTransactionManager;
}
public void setJtaTransactionManager(JtaTransactionManager jtaTransactionManager) {
this.jtaTransactionManager = jtaTransactionManager;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void insertItem(Item item){
TransactionTemplate tt = new TransactionTemplate(jtaTransactionManager);
tt.execute(new TransactionCallback<Object>(){
@Override
public Object doInTransaction(TransactionStatus arg0) {
JdbcTemplate jt = new JdbcTemplate(dataSource);
String sql = "insert into item(name,price) values ('aaaa',11);";
jt.setDataSource(dataSource);
jt.update(sql);
sql = "insert into item(name,price) values ('aaaa',12);";
jt.setDataSource(dataSource2);
jt.update(sql);
return null;
}
});
}
}
公共类客户道{
私有数据源;
私有数据源数据源2;
私人JtaTransactionManager JtaTransactionManager;
公共数据源getDataSource2(){
返回数据源2;
}
公共void setDataSource2(数据源dataSource2){
this.dataSource2=数据源2;
}
公共JtaTransactionManager getJtaTransactionManager(){
返回jtaTransactionManager;
}
公共无效设置JtaTransactionManager(JtaTransactionManager JtaTransactionManager){
this.jttransactionmanager=jttransactionmanager;
}
公共数据源getDataSource(){
返回数据源;
}
public void setDataSource(数据源数据源){
this.dataSource=数据源;
}
公共无效插入项(项){
TransactionTemplate tt=新的TransactionTemplate(jtaTransactionManager);
tt.execute(新TransactionCallback(){
@凌驾
公共对象doInTransaction(TransactionStatus arg0){
JdbcTemplate jt=新的JdbcTemplate(数据源);
String sql=“插入项目(名称、价格)值('aaaa',11);”;
jt.setDataSource(数据源);
jt.update(sql);
sql=“插入项目(名称、价格)值('aaaa',12);”;
jt.setDataSource(数据源2);
jt.update(sql);
返回null;
}
});
}
}
谁能告诉我哪里出了问题 您必须使用XA数据源。JDBC事务只跨单个数据源。要将事务范围扩展到多个数据源,必须使用XA数据源。您可以实现AbstractRoutingDataSource来处理多个数据源,数据源连接将基于您的内部设置