几天来,我一直在尝试使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中获得的连接(从DataSourceUtils.getConnection(dataSource))不是事务性的.此外,我在DataSourceTransactionManager.doGetTransaction()中放置了一个断点,只有在@Transactional批注直接位于获取连接的方法上时,才调用该断点.原谅我超载了该术语,但是@Transactional注释似乎并未在堆栈中传播.
我完全困惑.请帮忙! 🙂
最佳答案
我只是放弃了这一点.这不是很明显.您的问题是由使用EndOfDayProcess类in your entry point引起的.这是一个问题,因为它导致类被加载,并且更广泛地讲,它将扩展到您的* Process和* EntryPoint类中的任何一个.到那时,您的代码还没有启动Spring,因此它的加载时间编织器未处于活动状态,并且该类已正常加载,而没有编写交易代码.当然,类仅加载一次,因此可以保留下来,并且在Spring中创建bean时,它是一个类型与事务无关的bean,除了上面带有@Transactional批注.到那时,那里没有人可以看到他们了.我看到两个可能的(好的)解决方案:
>切换到构建时编织.这样一来,在编织课程之前就不可能加载它.
>根据入口点更改确定使用哪个* Process bean的方式.使用任何您喜欢的东西,除了会导致* Process类被加载的东西.