2012-01-09 12 views
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 
    } 

} 

Spring構成属性:春+休止状態、ネストされたNOT_SUPPORTEDトランザクションが

<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> 

が伝播してメソッドから呼び出されますREQUIRED_NEW伝播を入れ子にすることが可能ですがNOT_SUPPORTED?

私たちはdumpAllData()で大量のDB操作(〜100Mb)を実行しているので、トランザクションになりたくはありません(それはパフォーマンス上の問題です)。しかし、updateItemメソッド(ここでは単純なエンティティの更新)ではトランザクション(ロールバック/コミット)したいと考えています。

答えて

0

トランザクションの中にあるかどうかはわかりませんが、パフォーマンスには影響がありません。パフォーマンスの違いを測定したことがありますか、まあまあですか?

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

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

+1

1回のトランザクションで大量のデータベースを更新すると、データベースに負荷がかかります(Oracleの場合は巨大なREDOログ)。自動コミットモードで実行するか、小さなチャンクで分割する方がよいでしょう。 – mrembisz

+0

自動コミット?休止状態で?本当に悪い考え、IMHO。 @docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#batch –

+0

を参照してください。@Mrembisz:「小さい塊で分割する」 - そう、私たちの考えです。小さな変化を一つずつコミットしたい。役に立つリンクがありますか? Thx –

0

更新メソッドのトランザクション注釈は、同じクラスのメソッドから呼び出された場合、Springトランザクションインフラストラクチャによって代行受信されません。 Springトランザクションの仕組みの詳細については、Spring Transactionを参照してください。

関連する問題