Ho esplorato attraverso la sezione 3.4.4 modalità di blocco della specifica Java Persistence API 2.0 Final Release e mentre io non ho trovato nulla specifica (ma non dice che questo è il default o qualcosa del genere) c'è una nota a piè di pagina che dice quanto segue.
Il tipo di blocco NESSUNO può essere specificato come un valore degli argomenti di blocco modalità e fornisce anche un valore predefinito per le annotazioni.
La sezione è sulle tipologie di LockModeType
valori disponibili ei loro usi e descrive i metodi richiede un argomento di questo genere e quant'altro.
Quindi, come ha detto LockModeType.NONE
è di default per le annotazioni (JPA, annotazioni a destra ea sinistra) credo che quando si utilizza il valore di default EntityManager.find(Class, Object)
LockModeType
viene utilizzato.
Ci sono altri sottili, suggerimenti per rinforzare questo. Sezione 3.1.1 Interfaccia EntityManager.
il metodo Find (a condizione che sia invocato senza una serratura o invocato con LockModeType.NONE) e il metodo getReference non sono tenuti ad essere invocato in un contesto di transazione.
Ha senso. Ad esempio se si utilizza MySQL come database e il motore di database scelto è InnoDB, quindi (per impostazione predefinita) le tabelle utilizzeranno lo REPEATABLE READ
, se si utilizzano altri RDBMS o altri motori di database, ciò potrebbe cambiare.
In questo momento non sono esattamente sicuro che i livelli di isolamento abbiano nulla a che fare con le modalità di blocco JPA (anche se sembra così), ma il mio punto è che diversi sistemi di database differiscono in modo che JPA non possa decidere per voi (a almeno secondo le specifiche) quale modalità di blocco utilizzare per impostazione predefinita, quindi verrà utilizzato LockModeType.NONE
se non diversamente specificato.
Ho anche trovato an article regarding isolation levels and lock modes, potresti leggerlo.
Oh, e per rispondere alla tua ultima domanda.
Se non si definisce una modalità di blocco esplicita, l'integrità del database può essere persa?
E dipende, ma se si dispone di transazioni concorrenti allora la risposta è probabilmente sì .
Grazie per questa risposta costruttiva e il collegamento. Leggerò di nuovo e cercherò di capire LockModeType.NONE e cosa implica. Il fatto è che sono nuovo con JPA e non so esattamente quale entità (i) dovrei bloccare per mantenere l'integrità della certezza. Probabilmente è noioso, ma testerò tutte le modalità con la simulazione delle transazioni (Thread.sleep()). Grazie ancora –