2017-08-16 1 views
3

Weiß jemand, warum Spring nicht erlaubt, @Lock (LockModeType.PESSIMISTIC_WRITE) auf Leseoperationen zu setzen?Warum Spring erlaubt keine exklusive Sperre auf Lesevorgang?

@Lock(LockModeType.PESSIMISTIC_WRITE) 
Human findByNameAndStreet(String name, String street); 

Und warum auch EntityManager selbst erlaubt Ihnen, exklusive Sperre auf Lesevorgang setzen?

entityManager.createQuery("select o from Human o where o.name= :name and o.street= :street", Human.class) 
      .setLockMode(LockModeType.PESSIMISTIC_WRITE).setParameter("name", name).setParameter("street", street).getSingleResult(); 

Unterm Strich auf der gleichen Auswahlabfrage im Frühjahr kann ich setzen Schreibsperre nicht, und mit EntityManager ich bin in der Lage. Ich weiß nicht wirklich, warum Spring dich nicht dasselbe machen lässt.

+0

Welchen Effekt erwarten Sie von der pessimistischen Schreibsperre? – SpaceTrucker

+0

Zum ausschließlichen Sperren der Lesezeile. Der Code-Fluss ist spezifisch, daher sollte die erste Lese-Transaktion diese Zeile sperren, und die nächsten sollten warten, bis die erste fertig ist. Ich konnte das mit EntityManager implementieren, aber ich würde gerne wissen, warum Spring keine exklusive Sperre für ausgewählte Abfragen zulässt. – alxbxbx

+1

Ich denke, weil Ihre Transaktionsgrenzen falsch (oder nicht) definiert sind. –

Antwort

1

Um Sperren zu verwenden, müssen Sie die richtigen Transaktionsgrenzen haben. Wenn Sie sie nicht haben, ist der einzige Anruf, für den die Sperre funktioniert, die findByNameAndStreet.

Wenn Sie diese Methode jedoch von einer Servicemethode aufrufen, die selbst transaktional ist, würde die Sperre die gesamte transaktionale Servicemethode umfassen.

+0

Genau die Antwort, die ich brauchte. Danke vielmals! – alxbxbx

Verwandte Themen