Hallo zusammen,
ich versuche mich gerade an konkurrierenden Zugriffen zweier Transactions und das Verhalten bei einem bestimmten Locking Modus verwirrt mich. Es geht um LockModeType.OPTIMISTIC_FORCE_INCREMENT. In der Doku steht dazu folgendes:
Wenn ich das richtig verstehe, bedeutet das, dass die @Version-Property der Entity in jedem Fall um eins erhöht wird, auch wenn sich der Zustand der Entity nicht verändert. Dummerweise passiert genau das nicht. Ich benutze folgenden Code:
Der obige Code beschreibt nur den Ablauf wie ich ihn mit dem Debugger und Breakpoints simuliere.
Obwohl mo2.setMyAttribute(myValue); den Wert nicht verändert (weil myValue halt schon drin steht), würde ich wegen dem LockModeType nun eine Veränderung der @Version-Property nach dem tx2.commit(); erwarten. Das passiert aber nicht, sondern erst nach tx1.commit();
Woran liegt's? Was hab ich evtl. falsch verstanden?
ich versuche mich gerade an konkurrierenden Zugriffen zweier Transactions und das Verhalten bei einem bestimmten Locking Modus verwirrt mich. Es geht um LockModeType.OPTIMISTIC_FORCE_INCREMENT. In der Doku steht dazu folgendes:
undWRITE. In this case, the entity manager performs the same optimistic locking operations as for the READ lock mode. However, it also updates the entity's version column.
OPTIMISTIC_FORCE_INCREMENT. This is the same as the WRITE lock mode. The WRITE lock mode is still supported in JPA 2.0, but specifying OPTIMISTIC_FORCE_INCREMENT is recommended for new applications.
Wenn ich das richtig verstehe, bedeutet das, dass die @Version-Property der Entity in jedem Fall um eins erhöht wird, auch wenn sich der Zustand der Entity nicht verändert. Dummerweise passiert genau das nicht. Ich benutze folgenden Code:
Java:
tx1.begin();
MyObject mo1 = em.find(MyObject.class, 1);
tx2.begin();
MyObject mo2 = em.find(MyObject.class, 1);
em.lock(mo1, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
em.lock(mo2, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
mo2.setMyAttribute(myValue);
tx2.commit();
mo1.setMyAttribute(anotherValue);
tx1.commit();
Der obige Code beschreibt nur den Ablauf wie ich ihn mit dem Debugger und Breakpoints simuliere.
Obwohl mo2.setMyAttribute(myValue); den Wert nicht verändert (weil myValue halt schon drin steht), würde ich wegen dem LockModeType nun eine Veränderung der @Version-Property nach dem tx2.commit(); erwarten. Das passiert aber nicht, sondern erst nach tx1.commit();
Woran liegt's? Was hab ich evtl. falsch verstanden?