2 つのデータベースに接続する Spring & Hibernate Web アプリケーションがあります。
web.xml
で、アプリケーション コンテキスト ファイルのパスを次のように構成しました。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:config/*.xml
</param-value>
</context-param>
configディレクトリの下に3つのファイルがあります
- 1-primary-hibernateContext.xml
- 2-secondary-hibernateContext.xml
- 3- root-context.xml
最初のファイルでは、プライマリ データ ソース、セッション ファクトリ、およびトランザクション マネージャー (primary_manager) を構成しました。
2番目のファイルでも同じことをしました
3 番目のファイルでは、コンポーネント スキャンとトランザクション アノテーションの構成を次のように構成しました。
<tx:annotation-driven/>
<!-- Enable Spring annotation configuration -->
<context:annotation-config />
<!-- Scan the application for all possible Services & autowire -->
<context:component-scan base-package="net.mr2.*.service" />
<context:component-scan base-package="net.mr2.*.dao" />
次のようにディスパッチャーサーブレットを構成したサーブレットコンテキストxmlファイルがあります
<annotation-driven />
<context:component-scan base-package="net.mr2.*.web" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
@service
サービス クラスには&という注釈が付けられ@Transactional(value="secondary_transactionManager", readOnly=true, rollbackFor=Exception.class)
ます。
サービスが自動配線されている単一のコントローラーがあります。
コントローラーから、サービス クラスの 3 つのメソッド ( save1()
、save2()
、save3()
) を呼び出します。3番目のメソッドで例外をスローし、3番目のメソッドはロールバックする必要があると想定していますが、これは起こりません。
mysql ログを開いて 3 つの保存ステートメントを確認したところ、これらのステートメントがトランザクションで実行されていないことがわかりました。SET AUTOCOMMIT
insert ステートメントの前後にステートメントが見つからなかったので、気付きました。
したがって、トランザクションが適切に構成されていないと思います。
私の設定の問題は何ですか?