Domanda

Ecco il programma di installazione: la classe di entità ha la raccolta di altre entità che viene caricato pigramente. Il trucco è, ho bisogno di eseguire alcuni lavori relativi ai dati (ad esempio, voglio calcolare certa somma di controllo con gli elementi della collezione).

Il trucco è che voglio evitare a tutti i costi le condizioni di gara, come: "qualcuno ha aggiornato l'entità, mentre stavo facendo i miei calcoli di dati". In circostanze normali, mi limiterò a dichiaro getter / setter sincronizzato e sarò felice con lui. Ma per quanto ho capito, se l'altro thread decide di aggiornare lo stato un'entità dal database, mentre io sono nel bel mezzo del calcolo del checksum mia sarà completamente ignorare i metodi "sincronizzati" (sarà accedere al campo direttamente).

potrei sbagliarmi dura. Quindi la domanda è:? Non v'è alcun modo per "lock" l'accesso alla parte dell'entità o per l'intera entità in sé per il tempo dei calcoli di checksum iniziali

Grazie in anticipo! Post scriptum Se avete bisogno di un frammento di codice per illustrare il problema - fammelo sapere. Finora penso che la questione è abbastanza chiaro.

È stato utile?

Soluzione

  

potrei sbagliarmi dura. Quindi la domanda è:? Non v'è alcun modo per "lock" l'accesso alla parte dell'entità o per l'intera entità in sé per il tempo dei calcoli di checksum iniziali

JPA 2.0 supporta pessimistica concorrenza e si può leggere un soggetto e bloccare la riga corrispondente a livello di database (nota che il menzionato essere anteriore collegate la versione finale delle specifiche JPA 2.0 e non riflette tutti i possibili valori di enum LockMode, ma si ottiene l'idea).

E se si utilizza JPA 1.0, temo che dovrete utilizzare SQL nativo per eseguire la SELECT ... FOR UPDATE equivalente.

Bibliografia

    specifica
  • JPA 2.0
    • Sezione 3.4.4 "Blocco Modalità"

Altri suggerimenti

È inoltre possibile utilizzare @Version su un attributo della vostra entità (opere in JPA 1.0)

http://java.dzone.com/articles/jpa- 20-concorrenza-e-bloccaggio

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top