3

几天来,我一直试图让 Spring 事务在我的应用程序中正常工作,现在我无处可去,只能求助于社区。在此先感谢您的帮助。

我的应用程序有特定要求,我需要使用 @Transactional 注释受保护的覆盖方法并从抽象父类调用此方法。根据我的阅读,我不能使用代理,必须使用 mode=aspectj。

首先,一些配置:

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

<tx:annotation-driven transaction-manager="transactionManager"
    proxy-target-class="false" mode="aspectj" />

<context:load-time-weaver />

<bean name="ID_DataAccessor" class="dal.DataAccessor">
    <constructor-arg ref="dataSource" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost" />
           .....
    <property name="defaultAutoCommit" value="true" />
</bean>

如果我在 ID_DataAccessor 中的方法上使用 @Transactional 注释,则连接是事务性的 ( DataSourceUtils.isConnectionTransactional(c, dataSource) == true)。但这对我来说没用,因为一旦方法完成,事务就会提交。当我在调用 DataAccessor 中的方法的方法上使用 @Trasnactional 时,DataAccessor (from DataSourceUtils.getConnection(dataSource)) 中获取的连接不是事务性的。此外,我在 DataSourceTransactionManager.doGetTransaction() 中放置了一个断点,只有在 @Transactional 注释直接位于获取连接的方法上时才会调用此断点。请原谅我重载了术语,但似乎 @Transactional 注释不会向上传播堆栈。

我完全感到困惑。请帮忙!:)

4

1 回答 1

4

我差点放弃这个了。这是相当不明显的。您的问题是由在您的入口点EndOfDayProcess使用类引起的。这是一个问题,因为它会导致类被加载,更一般地说,它会扩展到您的任何 *Process 和 *EntryPoint 类。在您的代码中,Spring 尚未启动,因此其加载时编织器未激活,并且该类正常加载,而没有编织到其中的事务代码。当然,类只加载一次,所以它就在那里,当你在 Spring 中创建 bean 时,它是一个类型与事务无关的 bean,除了它上面有 @Transactional 注释。不过,到那时,已经没有人看到他们了。我看到了两种可能的(好的)解决方案:

  1. 切换到构建时编织。那么在编织之前就不可能加载一个类。
  2. 更改根据入口点确定要使用哪个 *Process bean 的方式。使用任何你喜欢的东西,除了会导致 *Process 类被加载的东西。
于 2011-10-16T20:58:24.453 回答