0

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 AUTOCOMMITinsert ステートメントの前後にステートメントが見つからなかったので、気付きました。

したがって、トランザクションが適切に構成されていないと思います。

私の設定の問題は何ですか?

4

2 に答える 2

0

サービス(トランザクションであるクラス)への呼び出しごとに新しいトランザクションを開くようにアプリを構成しました。コントローラでトランザクションを開始するか、サービスレベルで別のメソッドで呼び出しをラップする必要があります。

于 2012-12-30T18:39:31.587 に答える
0

間違ったトランザクション マネージャーでサービスに注釈を付けたことに気付きました。これが以前の奇妙な動作の原因です。

サービス(私が使用していた)には注釈が付けられました

@transactional(value='transaction_manger_1')

このトランザクション マネージャーは、挿入された DAO が読み取り/書き込み DB で動作する正しいセッション ファクトリを使用している間、read_only DB で動作するように構成されています。

そのため、トランザクションマネージャーを正しいものに変更しましたが、すべてうまくいきました。

于 2013-01-08T11:34:45.820 に答える