CMS
アプリケーションの場合は、スプリング3、JPA +休止状態を使用しています。そのアプリケーションでは、@Transactional
Annotation with rollBack
というアノテーションが付いたサービスクラスメソッドがあります。そのメソッドの内部では、ループを使用してデータ(エンティティクラス)をテーブルに挿入しています。ループの各エンティティクラスのiteration
については、データベースに保存する必要があります。しかし、それは起こっていません。コミットは、ループの実行が完了してメソッドを終了したときにのみ発生します。それから、すべてをすぐにコミットして保存します。しかし、このケースでは、コミットする前にデータベースに挿入されたデータを読み込む必要があります。私はISOLATION LEVEL
とコミットされていない読み取りしようとしましたが、私はデフォルトのJPADialect
を使用しているので、サポートされませんでした。また、の休止状態の実装をjpaDialect
に追加しようとしましたが、それでも機能しませんでした。この問題の回避策をお手伝いしてください。もう一つ、伝播に必要なメソッドを使用する方法があります。@トランザクションアノテーション+ループ内のデータ挿入
答えて
ループを使用してメソッドのトランザクションアノテーションを削除します。ループでは
は、保存を実行するために別のメソッドを呼び出して、そのメソッドのトランザクション
返信ありがとう@NimChimpsky、しかし、私はループでメソッドからTransactionalアノテーションを削除し、同じクラスの別のメソッドに与える場合でも、クラスレベルのTransactional注釈があります。クラスレベルの注釈が既に存在しているので、動作しません。クラスレベルでTransactionalアノテーションを指定して、そのクラスで定義されているいくつかのメソッドを無視する方法はありますか?つまり、トランザクション管理を考慮する必要はありません。 – Krishna
クラスレベルの注釈を削除して、それを使って試したところ、 – NimChimpsky
私はそれを試しましたが、アプリケーションを実行すると、 'トランザクションは進行中ではありません'というTransactionRequiedExceptionがスローされます。私は2つのメソッドを作成しました。あるメソッドではビジネス・ロジックを記述し、2つ目のメソッドではエンティティ・クラスを作成するコードを記述し、DAOクラスを参照してこれらのエンティティ・クラスを保存します。最初のメソッドの場合、私は何の注釈も与えませんでしたが、2番目のメソッドのために、Transactionalアノテーションにアノテーションを付けて伝播します。新しいプロパティが必要です。実行は最初のメソッドから開始されます。 – Krishna
あなたが正しいです、これはI
の略で、acidです。トランザクションは独立して動作しているため、他のトランザクションはコミットされる前にトランザクションを見ることができません。しかし、分離レベルで遊ぶのは悪い習慣です。むしろ、それぞれの繰り返しを開始とコミットを別々のトランザクションで実行するようアドバイスします。
これは、春のビットトリッキーであるが、ここでの例である:
public void batch() {
for(...) {
insert(...)
}
}
//necessarily in a different class!
@Transactional
public void insert() {
}
注batch()
は@Transactional
とinsert()
異なるクラス(春サービス)でなければならないと注釈さないあること。コメントするには長すぎますが、それは人生です。気に入らない場合は、TransactionTemplate
を手動で使用してください。
この問題を解決するためにTransactionTemplateを使用したいと思いますが、私は他のサービスクラスに対してDeclarative Transactionアプローチを使用しています。 TransactionTemplateとDeclarative Transactionsの両方を使用したプログラム型トランザクションを混在させるのは悪い動作ですか? – Krishna
作るあなたはSpring Doc for programmatic transactionsを参照して、(SpringのTransactionTemplate
やPlatformTransactionManager
を見てクラスで、プログラム取引に行く必要があるか、またはいずれかのことができますトランザクションがPropagation.REQUIRES_NEW
とマークされているループ内から別のトランザクションメソッドを呼び出します。つまり、そのメソッドの各呼び出しがそれ自身のトランザクションで実行されることを意味します。hereを参照してください2番目の方法では、別のSpring BeanでREQUIRES_NEWメソッドトランザクション内でループが実行されない場合は、REQUIRES_NEWを省略することもできます。
- 1. 挿入データ
- 2. 挿入データ::マップ
- 3. 挿入複数のデータ
- 4. SQLデータの挿入は
- 5. 挿入複数のデータ
- 6. Android SQLiteデータの挿入
- 7. ジャンクションテーブルでのデータ挿入
- 8. Androidデータの挿入とURI
- 9. データの挿入方法は?
- 10. Pythonのエラー挿入データ
- 11. データ挿入の問題
- 12. データベース内のデータの挿入と読み取り
- 13. MongoDBへのデータの挿入 - エラーなし、挿入なし
- 14. MongoDBの内部配列にデータを挿入
- 15. mysql - 挿入後に他のテーブルにデータを挿入するトリガー
- 16. データをコアプロットに挿入
- 17. 挿入するデータは、道
- 18. データをSQLテーブルに挿入
- 19. データベースにデータを挿入
- 20. Googleアプリケーションエンジンデータストアにデータを挿入
- 21. Android:データをデータベースに挿入
- 22. CodeIgniterアクティブレコードでデータを挿入
- 23. 内部的にデータベースにデータを挿入する方法は?
- 24. Androidのsqliteの挿入データSQLiteException
- 25. エラー挿入へのデータのSQLコンパクト
- 26. Doctrineリポジトリとエンティティのデータの挿入
- 27. '画像'タイプのデータの挿入スクリプト
- 28. sqliteでのデータ挿入の問題
- 29. MySQLのデータの挿入配列
- 30. フォーム内の入力要素内にアイコンを挿入
あなたはあなたの問題が何であるかを理解したようです。あなたはちょうど間違った場所にあなたのトランザクション境界を持っています。一度それを修正すると、期待どおりに動作することがわかります。 –
コミットまたは変更の分離レベルなしで、同じトランザクション内のコミットされていないデータを読み取ることができるはずです。私が知る限り、これは最も一般的な動作です。 –