0
public class BusinessService {  //spring bean

  public dumpAllData(List){

    /* Complicated DB operation here
     * We dont want to be in transaction now (because of performance issues)
     */ 

    for(...){           //iterating through whole list
      **updateItem(item);**
    }

  }

  public updateItem(Entity e){
    //saves entity into DB
    //we want to be in transaction now
  }

}

スプリング構成:

<tx:advice id="txAdvice" transaction-manager="wsTransactionManager">
    <tx:attributes>           
      <tx:method name="dumpAllData" propagation="NOT_SUPPORTED" />
      <tx:method name="updateItem" propagation="REQUIRES_NEW" />
    </tx:attributes>
</tx:advice>

伝播NOT_SUPPORTEDを持つメソッドから呼び出されるネストされたREQUIRED_NEW伝播を持つことは可能ですか?

dumpAllData()で大規模なDB操作(〜100Mb)を実行するため、トランザクションを実行したくありません(そうでない場合は、パフォーマンスの問題になります)。ただし、updateItemメソッド(エンティティの単純な更新のみを行う)でトランザクション(ロールバック/コミット)を実行する必要があります。

4

2 に答える 2

0

トランザクション内にいるかどうかがパフォーマンスにどのように影響するかわかりません。パフォーマンスの違いを測定しましたか、それとも単に推測しているだけですか?

とにかく、本当にこれを行う必要がある場合は、updateItemメソッドを別の Spring Bean に入れ、Bean に注入する必要がありBusinessServiceます。

実際、Spring は、プロキシを介して Bean メソッドが呼び出された場合にのみ、トランザクションを開始/コミットできます。同じ Bean の別のメソッドから Bean メソッドを呼び出すと、Spring は呼び出しをインターセプトしてトランザクション管理を行うことができません。

于 2012-01-09T14:27:43.450 に答える