Oracle
 sql >> Database >  >> RDS >> Oracle

Gestione degli aggiornamenti simultanei in modalità ibernazione

Qualcuno può spiegarmi se utilizziamo la primavera per la gestione delle transazioni, come verranno gestiti gli aggiornamenti simultanei da ibernazione (in memoria la gestione automatica della versione di ibernazione) o devo inserire la colonna della versione nel database per occuparmi manualmente degli aggiornamenti simultanei.

Che tu stia utilizzando Spring per la gestione delle transazioni o meno non ha molta importanza e non è rilevante quando si tratta di gestione della concorrenza, questo è effettivamente gestito da Hibernate. Hibernate può utilizzare 2 strategie per gestire gli aggiornamenti simultanei:blocco ottimistico e blocco pessimistico.

Ottimista

Quando si utilizza il blocco ottimistico, si mappa un attributo speciale (un numero, un timestamp) come una versione (quindi in realtà hai una colonna per questo). Questa versione viene letta quando recuperi un'entità e inclusa nella clausola where durante un aggiornamento e incrementato di Hibernate.

Per illustrare come funziona, immaginiamo di caricare un'entità Person con id=1 e con una versione corrente=1. Dopo un salvataggio, Hibernate eseguirà qualcosa del genere:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Quindi, ora, immagina di avere due transazioni simultanee in esecuzione, ognuna delle quali carica lo stesso entità (stesso numero di versione) e modificando il nome.

Supponiamo che la transazione n. 1 sia stata salvata per prima, che venga eseguita la seguente query:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Ci riesce e la versione viene incrementata.

Quindi viene eseguita la transazione n. 2, viene eseguita la seguente query:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Questo non aggiornerà nulla perché la clausola where non corrisponderà a nessun record. È qui che otterrai un'eccezione di concorrenza ottimistica.

Questa strategia è appropriata quando non si mantiene la connessione, quando gli accessi simultanei non sono frequenti e si ridimensiona molto bene. E ovviamente tutto viene gestito in modo trasparente da Hibernate per te, a condizione che venga mappato un attributo di versione.

Pessimista

Quando si utilizza il blocco pessimistico, Hibernate blocca un record per il tuo uso esclusivo fino a quando non hai finito con esso (in genere utilizzando un SELECT ... FOR UPDATE ). Qualsiasi altra transazione simultanea che tenti di accedere allo stesso record verrà sospesa fino alla rimozione del blocco. Questa strategia offre una migliore prevedibilità, al prezzo della performance e non scala indefinitamente.

Riferimenti

  • Guida di riferimento di Hibernate Core
    • 11.3. Controllo ottimistico della concorrenza
    • 11.4. Blocco pessimistico