Java 多个@Transactional不工作

Java 多个@Transactional不工作,java,spring,transactions,Java,Spring,Transactions,我使用的是Spring3.2.1版本。我的应用程序中有两个独立的数据源2 DB,我们必须分别在它们上运行声明性事务。不需要XA或JTA事务,因为它们永远不会在单个事务中一起使用 根据spring参考,我们可以有两个独立的事务管理器,在限定符的帮助下,我们可以指向它们,但不幸的是,在我的应用程序中只有一个可用 下面是我面临的问题 1.限定符不起作用,即使我在注释中输入了错误的跨国经理名称,即@TransactionalsomeBadName,spring也不会对此抱怨 2.我在spring上下文文

我使用的是Spring3.2.1版本。我的应用程序中有两个独立的数据源2 DB,我们必须分别在它们上运行声明性事务。不需要XA或JTA事务,因为它们永远不会在单个事务中一起使用

根据spring参考,我们可以有两个独立的事务管理器,在限定符的帮助下,我们可以指向它们,但不幸的是,在我的应用程序中只有一个可用

下面是我面临的问题

1.限定符不起作用,即使我在注释中输入了错误的跨国经理名称,即@TransactionalsomeBadName,spring也不会对此抱怨

2.我在spring上下文文件中有两个事务管理器。包含在上下文中的precenceincluded中的事务管理器是始终控制事务的事务管理器,另一个事务管理器被spring忽略

下面是配置文件

为了保持文章简短,我只展示了上下文和java文件的相关部分

事务管理器1 dataSourceA-Context.xml

    <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

}