何日も自分のアプリケーションで 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 アノテーションがスタックに反映されていないようです。
私は完全に困惑しています。助けてください!:)