几天来,我一直试图让 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 注释不会向上传播堆栈。
我完全感到困惑。请帮忙!:)