Я пытался заставить 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>
Если я использую аннотацию @Transactional для методав ID_DataAccessor соединение является транзакционным (DataSourceUtils.isConnectionTransactional(c, dataSource) == true
).Это бесполезно для меня, потому что транзакция фиксируется, как только метод завершен.Когда я использую @Trasnactional для метода, который вызывает метод в DataAccessor, соединение, полученное в DataAccessor (из DataSourceUtils.getConnection(dataSource)
), НЕ является транзакционным.Кроме того, я помещаю точку останова в DataSourceTransactionManager.doGetTransaction (), и она вызывается только в том случае, если аннотация @Transactional находится непосредственно в методе, получающем соединение.Простите за перегрузку терминологии, но похоже, что аннотация @Transactional не распространяется по стеку.
Я совершенно сбит с толку.Пожалуйста помоги!:)