2012-03-15 13 views
3

CMSアプリケーションの場合は、スプリング3、JPA +休止状態を使用しています。そのアプリケーションでは、@Transactional Annotation with rollBackというアノテーションが付いたサービスクラスメソッドがあります。そのメソッドの内部では、ループを使用してデータ(エンティティクラス)をテーブルに挿入しています。ループの各エンティティクラスのiterationについては、データベースに保存する必要があります。しかし、それは起こっていません。コミットは、ループの実行が完了してメソッドを終了したときにのみ発生します。それから、すべてをすぐにコミットして保存します。しかし、このケースでは、コミットする前にデータベースに挿入されたデータを読み込む必要があります。私はISOLATION LEVELとコミットされていない読み取りしようとしましたが、私はデフォルトのJPADialectを使用しているので、サポートされませんでした。また、の休止状態の実装をjpaDialectに追加しようとしましたが、それでも機能しませんでした。この問題の回避策をお手伝いしてください。もう一つ、伝播に必要なメソッドを使用する方法があります。@トランザクションアノテーション+ループ内のデータ挿入

+0

あなたはあなたの問題が何であるかを理解したようです。あなたはちょうど間違った場所にあなたのトランザクション境界を持っています。一度それを修正すると、期待どおりに動作することがわかります。 –

+0

コミットまたは変更の分離レベルなしで、同じトランザクション内のコミットされていないデータを読み取ることができるはずです。私が知る限り、これは最も一般的な動作です。 –

答えて

5

ループを使用してメソッドのトランザクションアノテーションを削除します。ループでは

は、保存を実行するために別のメソッドを呼び出して、そのメソッドのトランザクション

+0

返信ありがとう@NimChimpsky、しかし、私はループでメソッドからTransactionalアノテーションを削除し、同じクラスの別のメソッドに与える場合でも、クラスレベルのTransactional注釈があります。クラスレベルの注釈が既に存在しているので、動作しません。クラスレベルでTransactionalアノテーションを指定して、そのクラスで定義されているいくつかのメソッドを無視する方法はありますか?つまり、トランザクション管理を考慮する必要はありません。 – Krishna

+0

クラスレベルの注釈を削除して、それを使って試したところ、 – NimChimpsky

+1

私はそれを試しましたが、アプリケーションを実行すると、 'トランザクションは進行中ではありません'というTransactionRequiedExceptionがスローされます。私は2つのメソッドを作成しました。あるメソッドではビジネス・ロジックを記述し、2つ目のメソッドではエンティティ・クラスを作成するコードを記述し、DAOクラスを参照してこれらのエンティティ・クラスを保存します。最初のメソッドの場合、私は何の注釈も与えませんでしたが、2番目のメソッドのために、Transactionalアノテーションにアノテーションを付けて伝播します。新しいプロパティが必要です。実行は最初のメソッドから開始されます。 – Krishna

11

あなたが正しいです、これはIの略で、です。トランザクションは独立して動作しているため、他のトランザクションはコミットされる前にトランザクションを見ることができません。しかし、分離レベルで遊ぶのは悪い習慣です。むしろ、それぞれの繰り返しを開始とコミットを別々のトランザクションで実行するようアドバイスします。

これは、春のビットトリッキーであるが、ここでの例である:

public void batch() { 
    for(...) { 
     insert(...) 
    } 
} 

//necessarily in a different class! 
@Transactional 
public void insert() { 

} 

batch()@Transactionalinsert()異なるクラス(春サービス)でなければならないと注釈さないあること。コメントするには長すぎますが、それは人生です。気に入らない場合は、TransactionTemplateを手動で使用してください。

+0

この問題を解決するためにTransactionTemplateを使用したいと思いますが、私は他のサービスクラスに対してDeclarative Transactionアプローチを使用しています。 TransactionTemplateとDeclarative Transactionsの両方を使用したプログラム型トランザクションを混在させるのは悪い動作ですか? – Krishna

1

作るあなたはSpring Doc for programmatic transactionsを参照して、(SpringのTransactionTemplatePlatformTransactionManagerを見てクラスで、プログラム取引に行く必要があるか、またはいずれかのことができますトランザクションがPropagation.REQUIRES_NEWとマークされているループ内から別のトランザクションメソッドを呼び出します。つまり、そのメソッドの各呼び出しがそれ自身のトランザクションで実行されることを意味します。hereを参照してください2番目の方法では、別のSpring BeanでREQUIRES_NEWメソッドトランザクション内でループが実行されない場合は、REQUIRES_NEWを省略することもできます。