2010-03-02 6 views
5

Utilizzo l'implementazione EclipseLink di JPA 2.0 che consente il blocco pessimistico. So come bloccare un'entità ma come posso rilasciare il blocco? In un primo momento ho pensato che tutto questo fosse stato risolto all'interno di una transazione (in altre parole, l'entità è bloccata fino a quando non si impegna la transazione), ma non sembra essere il caso.Come rilasciare una riga bloccata usando JPA?

Ho provato un breve ricerca su Google (sembra che questo dovrebbe essere abbastanza ovvio), ma non ho trovato nulla ...

risposta

9

Dopo avere trovato un po 'di sonno ... e fare un po' di test al mattino, Credo di aver capito il mio problema. In questo modo il blocco viene effettivamente gestito all'interno di una transazione. Tuttavia, quando stavo testando il mio codice, ero in grado di recuperare una riga bloccata usando il metodo EntityManager.find (Class, key) (nessuna strategia di blocco specificata). Ho erroneamente pensato che mettendo un lucchetto su una fila, la riga non potesse essere letta. Periodo. Tuttavia, ho riletto le definizioni dell'APP del PESSIMISTIC_READ e PESSIMISTIC_WRITE e ho notato il mio problema:

PESSIMISTIC_READ - L'entità è bloccato sul database, impedisce qualsiasi altra operazione da acquisizione di un blocco PESSIMISTIC_WRITE. PESSIMISTIC_WRITE - L'entità è bloccata nel database, impedisce a qualsiasi altra transazione da di acquisire un blocco PESSIMISTIC_READ o PESSIMISTIC_WRITE.

Il blocco non impedisce necessariamente tutte le letture, impedisce solo un'altra transazione di mettere un blocco READ o WRITE sulla riga.

Problemi correlati