2016-05-23 14 views
1

私はJavaのメソッドを持っていて、spring Transactionalアノテーションでラップされています。Spring Transactionalアノテーション、READ_UNCOMMITTEDのアイソレーションが機能しない

私は2つの操作を内部に持っています.1つはdelete、もう1つはinsertです。私の挿入ステートメントは、最初の操作(これはdelete)に依存しなければなりませんが、最初の操作がまだコミットされていないため、挿入が失敗します(ユニーク制約)。しかし、これはおもしろいことですが、通常は同じトランザクション内で、私は同じトランザクションでコミットされていない操作を読み書きできるはずです(私の古い独自のフレームワークはこれを行うことができます)。しかし、これは私のシナリオでは起こりません。データがまだ削除されていないことがわかるため、挿入は失敗します。

アイソレーションREAD_UNCOMMITTEDを使用しようとしましたが、機能しません。

これらの2つの操作を同じトランザクションで実行する必要があります。いずれの操作も両方の操作をロールバックする必要があるため、最初の操作をコミットできず、2番目の操作に進むことができません。

Springフレームワークでどうすればいいですか?

休止状態で一般

答えて

3

、同じトランザクション内で、while flushing(committing) it always follows a particular order.

Inserts

が最初に実行され、その後フラッシュ中deletesが実行されます。あなたがinsertdeletingなので

だから、理想的にあなたのケースでは、単にdelete後、明示的にenitityManager.flush()を呼び出します。

代わりにも「...それをあなたがこのフラッシュモードは本当にデフォルトのフラッシュがコード順ではなく、どのように来る、私を殺しcommitauto

+1

のいずれかにモードタイプをフラッシュするように設定することができますEntityManager.setFlushMode()方法を見てみましょう常に特定の注文に従います "、私が参照できる文書はありますか?これには何らかの理由があるはずです... – GMsoF

+0

このhttp://docs.oracle.com/javaee/6/api/javax/persistence/FlushModeType.htmlによると、私の設定は "auto"としてデフォルトにする必要がありますそれは "すべてのクエリの実行"の前にフラッシュされませんか? – GMsoF

+3

http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/event/def/AbstractFlushingEventListener.html#performExecutions%28org.hibernate.event.EventSource%29 – shankarsh15

関連する問題