2011-08-17 4 views
1

例えば以下このサービスクラスのメソッド:@Transactionalをデータのみを取得するメソッドに配置するシナリオはありますか?

@Transactional 
public void findDiscountedItems() { 
    List<Item> items = itemDao.findItems(); 
    List<Item> discountedItems = new ArrayList<Item>(); 
    for (Item i: items) { 
     if (isDiscounted(i)) 
     discountedItems.add(i); 
    } 
    return discountedItems; 
} 

は、それが@Transactionalになるこの方法を必要とするすべてのシナリオがありますか?

答えて

2

はい、データベースで複数の読み取り操作を実行すると、一貫性が気になります。より制限的なトランザクション分離レベルを適用して読み取りロックを取得し、ファントム読み取りのような問題を回避できます。

クエリを1つだけ実行する場合は、トランザクションをreadOnlyとマークするか、または@Transactionalをスキップしてもかまいません。

+0

私の代理人は、ちょうど今同じことを言った。私が扱っているコードは私の例では簡略化されていませんが、実際にはいくつかのテーブルを読み込む検索SQLを持っています。そのうちのいくつかは別のアプリケーションで使用されているテーブルです(これらの2つのアプリケーションは、もう一方のデコレータアプリ)。 –

0

でもそうだが、その場合は@Transactional(readOnly=true)で十分であり、データストアが効率的な作業を行うのに役立つ。 'Isolation'は、おそらくこの場合、トランザクションを使用する最も重要な理由です。

関連する問題