gpt4 book ai didi

java - Spring @transactional 与 mode=aspectj 行为异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:24 24 4
gpt4 key购买 nike

几天来,我一直在努力让 Spring 事务在我的应用程序中正常工作,现在我别无选择,只能求助于社区。预先感谢您的帮助。

我的应用程序有特定要求,我需要使用 @Transactional 注释 protected 重写方法并从抽象父类调用此方法。据我所知,我不能使用代理,必须使用 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 尚未启动,因此其加载时编织器未处于 Activity 状态,并且该类正常加载,而没有将事务代码编织到其中。当然,类只加载一次,所以它会一直存在,当你在 Spring 中创建 bean 时,它是一个类型与事务无关的 bean,除了它上面有 @Transactional 注释。不过到那时,已经没有人再来看他们了。我看到两个可能的(好的)解决方案:

  1. 切换到构建时编织。那么在编织之前加载一个类是不可能的。
  2. 更改根据入口点确定要使用哪个 *Process bean 的方式。使用任何你喜欢的东西,除了导致加载 *Process 类的东西。

关于java - Spring @transactional 与 mode=aspectj 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7785609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com