2009-11-01 2 views

risposta

13

Uno è un blocco di lettura e l'altro è un blocco di scrittura, o durante una lettura o un aggiornamento, rispettivamente.

FTA:

  • PESSIMISTIC_READ. Il gestore dell'entità blocca l'entità non appena una transazione lo legge. Il blocco è trattenuto fino al completamento della transazione. Questa modalità di blocco viene utilizzata quando si desidera per eseguire query sui dati utilizzando la semantica ripetibile . In altre parole, si desidera che assicuri che i dati non siano aggiornati a tra le letture successive. Questa modalità di blocco non blocca altre transazioni dalla lettura dei dati.

    PESSIMISTIC_WRITE. Il gestore dell'entità blocca l'entità non appena una transazione lo aggiorna. Questo blocco della modalità impone la serializzazione tra le transazioni che tentano di aggiornare i dati dell'entità . Questa modalità di blocco è spesso utilizzata quando c'è un'alta probabilità di errore di aggiornamento tra le transazioni di aggiornamento simultanee di tra simultaneo.

+2

grazie, ho visto la descrizione, ma mi confondono ancora. Quando utilizzo PESSIMISTIC_READ e PESSIMISTIC_WRITE, ottiene sempre lo stesso risultato in "show sql" e il risultato in esecuzione. – paka

+0

Bella spiegazione !. Potresti aggiungere qualche codice di esempio per dimostrarlo? – Velu

+0

@paka: la specifica JPA dice: "È consentito che un'implementazione utilizzi LockModeType.PESSIMISTIC_WRITE dove è stato richiesto LockModeType.PESSIMISTIC_READ, ma non viceversa." vedere [questa risposta] (http://stackoverflow.com/a/33081311/3994580) per i dettagli – DaniEll

5

La specifica consente all'implementazione JPA di utilizzare un tipo diverso di blocco del database per ciascuno. La maggior parte dei database ha solo un tipo di blocco dichiarativo, quindi nella maggior parte delle implementazioni i due sono identici (non c'è differenza).

28

La differenza sta nel meccanismo di bloccaggio.

PESSIMISTIC_READ blocco significa che letture sporche e letture non ripetibili sono impossibili quando si dispone di un tale blocco. Se i dati devono essere modificati è richiesto per ottenere PESSIMISTIC_WRITE blocco

PESSIMISTIC_WRITE garanzie di blocco che oltre sporca e non ripetibili legge sono impossibili è possibile aggiornare i dati senza ottenere serrature aggiuntive (ed eventuale deadlocks in attesa di blocco esclusivo).

╔══════════════════════╦══════════════════════════╦══════════════════════════╗ 
║  LockModeType  ║  PESSIMISTIC_READ  ║ PESSIMISTIC_WRITE  ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║   type   ║  SHARED LOCK  ║  EXCLUSIVE LOCK  ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║ isReadOnly without ║       ║       ║ 
║ additional locks ║   YES   ║   NO   ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║  dirty reads  ║   NO   ║   NO   ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║ non-repeatable reads ║   NO   ║   NO   ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║ how to update data ║ obtain PESSIMISTIC_WRITE ║   ALLOWED   ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║      ║  no one holds  ║  no one holds  ║ 
║ how to obtain lock ║  PESSIMISTIC_WRITE ║ PESSIMISTIC_READ or ║ 
║      ║       ║ PESSIMISTIC_WRITE  ║ 
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║      ║       ║ when there is a high ║ 
║      ║ you want to ensure no ║ likelihood of deadlock or║ 
║  when to use  ║ dirty or non-repeatable ║ update failure among ║ 
║      ║ reads are possible  ║ concurrent updating ║ 
║      ║       ║  transactions  ║ 
╚══════════════════════╩══════════════════════════╩══════════════════════════╝ 

Risorse:

JPA 2.1

5

Il PESSIMISTIC_READ acquisisce un (lettura) blocco condiviso sul record riga della tabella associata, mentre il PESSIMISTIC_WRITE acquisisce un esclusivo (scrittura) serratura.

Il blocco condiviso blocca qualsiasi altra richiesta di blocco esclusiva simultanea, ma consente di continuare altre richieste di blocco condivise.

Il blocco esclusivo blocca sia le richieste di blocco condivise che esclusive.

Che cosa è degno di nota è che, per Hibernate, se il database non supporta blocchi condivisi (ad esempio Oracle), poi una richiesta di blocco condiviso (PESSIMISTIC_READ) semplicemente acquisire una richiesta di blocco esclusivo (PESSIMISTIC_WRITE).

Per ulteriori dettagli, consultare this article about locks e this article about JPA pessimistic lock types.