Perché è un "aggiornamento perso" nell'esempio di Transaction Leggi Immessed della documentazione Oracle?

StackOverflow https://stackoverflow.com//questions/24017303

Domanda

Nel libro " Oracle Database Concepts ", Oracle fornisce un esempio per spiegare Read Committed Isolation Level.

Nell'esempio, Transazione 1 Aggiornamenti Row 1, quindi Transaction 2 Aggiorna la stessa riga prima che si impegna la transazione 1. Quindi, la transazione 2 attende fino a quando la transazione 1 si impegna. Quindi la transazione 1 si impegna. La transazione 2 si impegna dopo. Naturalmente, dopo la transazione 2 commit, l'aggiornamento della riga 1 per transazione 1 è sovrascritto dalla transazione 2.

Considera questa situazione come lost update. Ma a mio avviso, non dovrebbe essere un "aggiornamento perso" poiché la transazione 1 ha commesso. L'aggiornamento perso è considerato in una singola transazione. Il programma è anche uguale a un programma serializzabile indipendentemente dalle operazioni di lettura.

L'esempio è qui , o Più specificamente, qui .

In Glossario di Oracle, l'aggiornamento perso è -

.

Un problema di integrità dei dati in cui uno scrittore di dati sovrascrive le modifiche di uno scrittore diverso che modifica gli stessi dati.

Allora, cosa ne pensi di questo? È un "aggiornamento perso" e in caso affermativo, questo tipo di aggiornamento perso può essere evitato per il controllo della concorrenza del database?

Qualsiasi commento e aiuto sarebbe apprezzato.

È stato utile?

Soluzione

È considerato un "aggiornamento perso" perché la sessione 2 ha sovrascritto il cambiamento che la sessione 1 aveva fatto senza essere consapevole che lo stava facendo. Per quanto riguarda la sessione 2, leggi la riga "Banda" con uno stipendio di 6200 e lo aggiornato a 6300 - non ha mai visto l'aggiornamento della sessione 1 a 7000.

Poiché tale documentazione dice: "Effettuare una strategia per gestire gli aggiornamenti persi è una parte importante dello sviluppo dell'applicazione" - I.e. Non fa parte della funzionalità di concorrenza dei dati incorporata del DBMS. All'interno di una transazione questo può essere fatto usando select for update per tentare di bloccare la riga. In questo esempio, la selezione della sessione 2 della fila 'Banda' sarebbe stata bloccata se lo avesse fatto. Una volta impegnata la sessione 1, la sessione 2 avrebbe ricevuto il blocco e vedrebbero il nuovo stipendio. In un ambiente apolidi come un'applicazione Web Blocco ottimistico è usato per ottenere questo.

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