2016-05-23 10 views
1

Ich habe eine Methode in Java, die von einer spring Transactional Annotation umschlossen ist.Spring Transaktionsannotation, Isolierung funktioniert nicht für READ_UNCOMMITTED

Ich habe 2 Operationen innerhalb, einer ist delete, ein anderer ist insert. Meine Einfügung-Anweisung muss sich auf die erste Operation verlassen (die delete ist), aber jetzt wegen der ersten Operation noch nicht festgeschrieben, meine Einfügung fehlschlagen (eindeutige Einschränkung). Aber das ist komisch, dass ich in der Regel innerhalb derselben Transaktion in der Lage sein sollte, die nicht-committed Operation in derselben Transaktion zu lesen/zu sehen (mein altes proprietäres Framework ist dazu in der Lage), aber das passiert nicht für mein Szenario, das zweite Einfügung schlägt immer noch fehl, weil die Daten noch nicht gelöscht sind.

Ich versuche, Isolation READ_UNCOMMITTED zu verwenden, aber es funktioniert nicht.

Ich muss diese beiden Operationen in derselben Transaktion, da jeder der Fehler Rollback beide Operationen, ich kann nicht die erste Operation fest, dann weiter mit der zweiten.

Wie kann ich das im Spring-Framework tun?

Antwort

3

Allgemeinen in den Ruhezustand, in der gleichen Transaktion, while flushing(committing) it always follows a particular order.

Inserts werden, werden zuerst ausgeführt und dann deletes ausgeführt, während dem Spülen.

Also ideal in Ihrem Fall, da Sie deleting vor insert sind rufen Sie einfach enitityManager.flush() explizit nach delete.

Alternativ haben auch einen Blick auf EntityManager.setFlushMode() Methode, wo Sie Modustyp festlegen spülen, um entweder commit oder auto

+1

Diese Spülmodus mich wirklich töten, wie kommt die Spülung Standard ist nicht von Code, um ... „es folgt immer einer bestimmten Reihenfolge ", gibt es ein Dokument, auf das ich mich beziehen kann? es sollte einen Grund dafür geben ... – GMsoF

+0

nach dieser http://docs.oracle.com/javaee/6/api/javax/persistence/FlushModeType.html, sollte meine Config standardmäßig wie "auto" sein, wie kommt es es wird nicht vor "allen Abfrageausführung" gelöscht? – GMsoF

+3

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