1

Spring+Struts+Hibernate セットアップで宣言型トランザクション管理を実装しようとしています。これは私のapplicationcontext.xmlの一部です

<property>
  <props>
    <prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop>
  </props>
</property>

FooService クラスに 2 つのパブリック メソッドを定義しました -> UpdateFoo、foodooTest、および 2 つのプライベート メソッド (更新ロジックを持つ) -> Test1 と Test2

呼び出しは次のようになります。

UpdateFoo->foodooTest->Test1
                     ->Test2

(foodooTest がトランザクションをトリガーする必要があります) Bean を作成します

FooService fooService = (FooService)context.getBean("fooService");
//and call
fooService.UpdateFoo();

Test2 は FooException をスローするため、トランザクションがロールバックすることを期待しています。しかし、そうではありません。コミットは、Test1 と Test2 のそれぞれで発生します (例外まで)。更新には Hibernate getHibernateTemplate.Merge() を使用します。私のデータベース エンジンは InnoDB です。

ここで何が欠けているのかわかりません。

4

1 に答える 1

1

Spring は、カスタム例外が拡張された場合にのみ、例外でトランザクションをロールバックしますRuntimeExceptionFooException拡張することを確認してくださいRuntimeException参照):

デフォルトの構成では、Spring Framework のトランザクション インフラストラクチャ コードは、実行時のチェックされていない例外の場合にのみ、ロールバックのトランザクションをマークします。つまり、スローされた例外が RuntimeException のインスタンスまたはサブクラスである場合です。(エラーは、デフォルトではロールバックも発生します)。トランザクション メソッドからスローされたチェック例外は、既定の構成ではロールバックされません。

あなたのコメントに基づいて、次の 2 つの点を確認してください。1) プラットフォーム トランザクション マネージャーが構成されていることを確認します。例:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

さらに、トランザクションにアノテーションを使用する場合は、それも設定する必要があります。

<tx:annotation-driven />
于 2011-08-26T13:09:04.937 に答える