Java 多个@Transactional不工作
我使用的是Spring3.2.1版本。我的应用程序中有两个独立的数据源2 DB,我们必须分别在它们上运行声明性事务。不需要XA或JTA事务,因为它们永远不会在单个事务中一起使用 根据spring参考,我们可以有两个独立的事务管理器,在限定符的帮助下,我们可以指向它们,但不幸的是,在我的应用程序中只有一个可用 下面是我面临的问题 1.限定符不起作用,即使我在注释中输入了错误的跨国经理名称,即@TransactionalsomeBadName,spring也不会对此抱怨 2.我在spring上下文文件中有两个事务管理器。包含在上下文中的precenceincluded中的事务管理器是始终控制事务的事务管理器,另一个事务管理器被spring忽略 下面是配置文件 为了保持文章简短,我只展示了上下文和java文件的相关部分 事务管理器1 dataSourceA-Context.xmlJava 多个@Transactional不工作,java,spring,transactions,Java,Spring,Transactions,我使用的是Spring3.2.1版本。我的应用程序中有两个独立的数据源2 DB,我们必须分别在它们上运行声明性事务。不需要XA或JTA事务,因为它们永远不会在单个事务中一起使用 根据spring参考,我们可以有两个独立的事务管理器,在限定符的帮助下,我们可以指向它们,但不幸的是,在我的应用程序中只有一个可用 下面是我面临的问题 1.限定符不起作用,即使我在注释中输入了错误的跨国经理名称,即@TransactionalsomeBadName,spring也不会对此抱怨 2.我在spring上下文文
<context:annotation-config />
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
<qualifier value="**DATABASE_A**" />
</bean>
<bean id="driverManagerDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
lazy-init="true">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" lazy-init="true">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="dataSource" parent="c3p0DataSource" />
<bean id="simpleJdbcDaoSupport"
class="org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport">
<property name="dataSource" ref="dataSource" />
</bean>
<context:annotation-config />
<bean id="sMTxManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="sMDataSource" />
<qualifier value="**DATABASE_B**" />
</bean>
<bean id="c3p0SmDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" lazy-init="true">
<property name="driverClass" value="${jdbc.servletmaster.driver}" />
<property name="jdbcUrl" value="${jdbc.servletmaster.url}" />
<property name="user" value="${jdbc.servletmaster.user}" />
<property name="password" value="${jdbc.servletmaster.password}" />
</bean>
<bean id="sMDataSource" parent="c3p0SmDataSource" />
<bean id="sMSimpleJdbcDaoSupport"
class="org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport">
<property name="dataSource" ref="sMDataSource" />
</bean>
<tx:annotation-driven mode="aspectj" />
<import resource="classpath:dataSourceA-context.xml" />
<import resource="classpath:dataSourceB-context.xml" />
观察
无论何时调用createDataInDB__A,事务都不会回滚
无论何时调用createDataInDB_B,事务都会回滚。
Spring从不抱怨@TransactionalSOME\u坏名字,即坏名字,
事务已回滚。事务管理器限定符不工作。
如果我颠倒包含的事务管理器的顺序,首先是dataSourceB-Context.xml,然后是dataSourceA-Context.xml,那么行为也会颠倒,所有事情都从A开始,到B停止。
两个事务管理器不能共存,只有一个可以工作,或者我可能做错了什么。我正在Tomcat上测试这个web应用程序。请帮助 删除所有AnnotationTransactionSpect,只保留一个,不带到事务管理器的链接。当将模式设置为aspectj时,要求您具有加载时或编译时编织功能,如果您没有这样的功能,则基本上忽略您的@Transactional。感谢您的回答,我在准备BuildCompile时集成了ajc编译器,它够了吗?应该够了,然后像我提到的那样相应地修改配置。发布修改后的配置,并请指定测试方法。我还建议升级到Spring 3.2.9,作为Spring 3.2.x系列的最新版本。好吧,我不能升级Spring,这有很多批准周期。我正在Tomcat上测试它作为一个web应用程序。我修改的配置在下面的答案中
@Component
public class DualDBService{
@Autowire
private DatabaseADao dbA_Dao;
@Autowire
private DatabaseBDao dbB_Dao;
@Transactional("DATABASE_A")
public void createDataInDB_A(){
dbA_Dao.insert("database A data");
throw new RuntimeException("rollback in DB A");
}
@Transactional("DATABASE_B")
public void createDataInDB_B(){
dbB_Dao.insert("database B data");
throw new RuntimeException("rollback in DB B");
}
@Transactional("SOME_BAD_NAME")
public void badTransName_StillWorking(){
dbB_Dao.insert("database B data");
throw new RuntimeException("rollback in DB B");
}
// setter-getter for DAO's
}