1

Fuse (OSGi) 内に mybatis-spring integration 1.0.1 をデプロイした mybatis 3.0.4 があります。SQLServer 2008 内に基本的なデータベースを作成しました。Spring では、TransactionAwareDataSourceProxyデータ ソースとDataSourceTransactionManagerトランザクション マネージャーを構成しました。

これで、いくつかの行をデータベースに挿入する Fuse 内にデプロイする独自のバンドルを作成しました。構成済みのデータ ソースとトランザクション マネージャーを使用するようにバンドルに指示しました。ロジックを実行するメソッドは次のようになります。

@Transactional(propagation=Propagation.REQUIRED)
public void go(RecsCashContext context) throws ActionException {

このメソッドが例外をスローすると、予期される動作がトリガーされるのを確認することで、Spring を追跡できます。これにより、SpringsJtaTransactionManagerdoRollBack(..).

したがって、データベースを見ると、以前の挿入がロールバックされていないため、データベースが不安定な状態にあることを除いて、すべてが有望に見えます。

私はこれについて途方に暮れており、オンラインで情報を見つけるのに苦労しています。何かご意見は?

4

2 に答える 2

3

どのような例外がスローされていますか? 特定の例外がスローされたときにSpringに明示的にロールバックするように指示しない限り、処理は続行されます。デフォルトでは、Spring のトランザクション処理は、チェックされていない例外 (RuntimeException など) がスローされた場合にのみロールバックします。あなたの場合、 ActionException が発生したときにロールバックが発生すると予想している場合は、次の変更を加えない限り運が悪いです:

@Transactional(rollbackFor={ActionException.class})
public void go(RecsCashContext context) throws ActionException {

詳細については、ここ、特にセクション 10.5.6.1 の @Transactional 設定を参照してください。

于 2011-06-21T11:49:43.307 に答える
1

結局のところ、Fuse (servicemix) はすでに bundle 内の OSGi サービスを介してトランザクション マネージャーを公開していますorg.apache.aries.transaction.manager_0.2.0.incubating [49]。その結果、トランザクション マネージャー サービスを調べていたときに、バンドル 49 によって公開されたものが最初に取り上げられました。

これは、関心のあるトランザクション マネージャーを明確に指定することで解決されました。現在、bean-name プロパティを使用してこれを行っています。

<osgi:reference id="transactionManager" bean-name="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />

これはフィルターを使用して行うこともできますが、独自のトランザクション マネージャー サービスを提供するのではなく、既に公開されているトランザクション マネージャー サービスを利用することをお勧めします。

于 2011-06-23T08:02:46.710 に答える