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メソッド(ここでは単純なエンティティの更新)ではトランザクション(ロールバック/コミット)したいと考えています。
1回のトランザクションで大量のデータベースを更新すると、データベースに負荷がかかります(Oracleの場合は巨大なREDOログ)。自動コミットモードで実行するか、小さなチャンクで分割する方がよいでしょう。 – mrembisz
自動コミット?休止状態で?本当に悪い考え、IMHO。 @docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#batch –
を参照してください。@Mrembisz:「小さい塊で分割する」 - そう、私たちの考えです。小さな変化を一つずつコミットしたい。役に立つリンクがありますか? Thx –