Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> software >> Software Database >> .

Quali misure possono essere prese per impedire il problema dell'aggiornamento perso nei sistemi di gestione del database?

Il problema di aggiornamento perso si verifica quando due o più transazioni leggono gli stessi dati, quindi aggiornano in base alle rispettive letture. Se le transazioni non sono correttamente sincronizzate, gli aggiornamenti di una transazione possono sovrascrivere gli aggiornamenti di un'altra, portando a dati persi. Ecco diverse misure che possono essere prese per prevenire questo:

1. Meccanismi di bloccaggio:

* blocchi esclusivi (lucchetti di scrittura): Quando una transazione desidera aggiornare una riga, acquisisce un blocco esclusivo su quella riga. Nessun'altra transazione può acquisire alcun tipo di blocco (lettura o scrittura) su quella riga fino a quando il blocco esclusivo non viene rilasciato. Ciò garantisce che una sola transazione possa modificare la riga in qualsiasi momento.

* blocchi condivisi (leggi blocchi): Quando una transazione vuole leggere una riga, acquisisce un blocco condiviso su quella riga. Transazioni multiple possono contenere contemporaneamente blocchi condivisi nella stessa riga. Tuttavia, nessuna transazione può acquisire un blocco esclusivo mentre ci sono blocchi condivisi in quella riga. Questo impedisce agli scrittori di interferire con i lettori.

* Lock granularity: Il livello al quale vengono applicati i blocchi (ad es. A livello di riga, livello di pagina, livello di tabella, livello di database) influisce sulla concorrenza e sulle prestazioni. Il bloccaggio a grana più fine (ad es. Livello di riga) consente una maggiore concorrenza ma ha un sovraccarico più elevato, mentre il bloccaggio a grana più grossolana (ad esempio, il livello della tabella) riduce le spese generali ma limita la concorrenza.

2. Protocolli di controllo della concorrenza:

* Blocking bidone (2PL): Un protocollo di controllo della concorrenza che garantisce la serializzabilità (e quindi impedisce gli aggiornamenti persi). Ha due fasi:

* Fase di crescita: Una transazione può acquisire serrature ma non può rilasciarle.

* Fase di riduzione: Una transazione può rilasciare blocchi ma non può acquisirne di nuove.

Il blocco a due fasi rigoroso (rigoroso 2PL) contiene tutte le serrature esclusive fino alla fine della transazione (commit o rollback). Ciò impedisce i rollback a cascata (in cui un fallimento di una transazione può forzare il rollback degli altri).

* Timestamp Ordering (to): A ogni transazione viene assegnato un timestamp unico. Il sistema utilizza questi timestamp per garantire che le operazioni contrastanti siano eseguite nell'ordine dei loro timestamp. Se una transazione cerca di scrivere un valore che è già stato sovrascritto da una transazione con un timestamp successivo, la scrittura viene respinta e la transazione viene ribaltata. Questo approccio evita i deadlock, ma può portare alla fame.

* Controllo ottimista di concorrenza (OCC): Le transazioni procedono senza acquisire serrature. Prima di commettere una transazione, controlla se qualsiasi altra transazione ha modificato i dati che ha letto. Se ci sono conflitti, la transazione viene ribaltata. OCC è adatto per situazioni con bassa contesa, poiché i rollback possono essere costosi. In genere ha tre fasi:

* Leggi Fase: La transazione legge i dati e li memorizza in uno spazio di lavoro locale.

* Fase di convalida: Il sistema controlla se uno qualsiasi dei dati della transazione è stato modificato da un'altra transazione da quando è stata letta.

* Fase di scrittura: Se la convalida ha esito positivo, le modifiche vengono applicate al database. Altrimenti, la transazione viene ripostata.

3. Utilizzo delle transazioni:

* Proprietà acide: Usa sempre le transazioni e assicurati che il sistema di database imponga le proprietà acide (atomicità, coerenza, isolamento, durata). La proprietà "Isolation" è cruciale per prevenire gli aggiornamenti persi.

* Livelli di isolamento delle transazioni: I database SQL offrono diversi livelli di isolamento (ad es. Leggi non impegnati, lettura commessa, lettura ripetibile, serializzabile). Livelli di isolamento più elevati (ad esempio, serializzabile) forniscono garanzie più forti contro problemi di concorrenza come gli aggiornamenti persi, ma possono ridurre la concorrenza e le prestazioni. Scegli attentamente il livello di isolamento appropriato per le esigenze dell'applicazione. `Serializzabile 'è il più restrittivo e sicuro, ma potenzialmente lento. `Lettura impegnata` è un valore predefinito comune e fornisce una protezione ragionevole.

4. Logica a livello di applicazione:

* Operazioni atomiche (confronta e swap): Alcuni sistemi di database e linguaggi di programmazione forniscono operazioni atomiche che possono essere utilizzate per eseguire operazioni di read-modify-write in un unico passaggio indivisibile. Ad esempio, l'operazione "Confront-and-swap" (CAS) può aggiornare atomicamente un valore se e solo se il suo valore corrente corrisponde a un valore atteso specificato. Questo approccio può evitare la necessità di blocchi espliciti in alcuni casi.

* Registrare versione/blocco ottimista nell'applicazione: L'applicazione può includere un numero di versione (o timestamp) nei dati che legge. Quando si aggiorna i dati, l'applicazione include il numero di versione originale. Il database aggiorna quindi la riga solo se il numero di versione corrisponde al numero di versione corrente nel database. Se i numeri di versione non corrispondono, l'aggiornamento viene respinto e l'applicazione deve riprovare l'aggiornamento. Questa è un'altra implementazione della strategia di controllo della concorrenza ottimista.

* Considerazioni sulla logica aziendale: Rivedere la logica aziendale per vedere se esistono modi per evitare del tutto le operazioni di read-modifica-scrittura. Puoi riprogettare il modello di dati o il processo per evitare il potenziale per gli aggiornamenti persi?

5. Design del database:

* Normalizzazione: Un database correttamente normalizzato aiuta a ridurre la ridondanza dei dati e migliorare la coerenza dei dati, il che può indirettamente aiutare a prevenire i problemi di concorrenza.

* Tipi di dati appropriati: L'uso di tipi di dati appropriati per i dati può aiutare a prevenire errori e migliorare le prestazioni, il che può indirettamente aiutare a prevenire i problemi di concorrenza.

Scenario di esempio e soluzioni:

Immagina due utenti che cercano di aggiornare la quantità di un prodotto in una tabella di inventario.

* Utente A: Legge la quantità (ad es. 10). L'utente A desidera vendere 2, quindi calcola nuova quantità come 8.

* Utente B: Legge la quantità (ad es. 10). L'utente B desidera vendere 3, quindi calcola nuova quantità come 7.

* Utente A: Scrive la nuova quantità (8) nel database.

* Utente B: Scrive la nuova quantità (7) nel database.

La quantità finale nel database è 7, ma dovrebbe essere 5 (10 - 2 - 3). L'aggiornamento dell'utente A è stato perso.

Ecco alcune soluzioni per questo scenario:

* Blocco esclusivo: Quando uno dei due utenti legge la quantità per l'aggiornamento, acquisire un blocco esclusivo nella riga del prodotto. L'altro utente deve attendere fino al rilascio del blocco prima di leggere e aggiornare.

* Livello di isolamento serializzabile: Impostare il livello di isolamento delle transazioni su serializzabile. Ciò garantisce che le due transazioni siano effettivamente serializzate, impedendo loro di interferire tra loro.

* Blocco ottimistico (con numero di versione):

1. Quando l'utente A legge la quantità (10), leggono anche un numero di versione (ad es. 1).

2. L'utente A calcola la nuova quantità (8) e include il numero di versione originale (1) nell'istruzione Aggiornamento.

3. Il database aggiorna la quantità solo se il numero di versione corrente è ancora 1. L'istruzione di aggiornamento aumenta anche il numero di versione (ad esempio, a 2).

4. Se l'utente B tenta di aggiornare dopo che l'utente A si è già impegnato, l'aggiornamento dell'utente B fallirà (perché il numero di versione è ora 2) e dovrà rileggere i dati e riprovare l'aggiornamento.

* Funzionamento di incremento/decremento atomico: Utilizzare un'operazione di incremento/decremento atomico specifico per il database, se disponibile. Ad esempio:`Aggiorna l'inventario Imposta quantità =quantità-2 dove Product_id =x` Questo approccio evita la sequenza di read-modifica-scrittura.

Scegliere l'approccio giusto:

L'approccio migliore per prevenire gli aggiornamenti persi dipende da diversi fattori, tra cui:

* Livello di concorrenza: Con quale frequenza vengono apportati gli aggiornamenti agli stessi dati?

* Requisiti di prestazione: Qual è il sovraccarico accettabile per il controllo della concorrenza?

* Capacità di sistema del database: Quali meccanismi di controllo della concorrenza sono supportati dal database?

* Complessità dell'applicazione: Quanto è complessa la logica dell'applicazione e quanto facilmente può essere modificata?

Un'attenta considerazione di questi fattori ti aiuterà a scegliere la soluzione più efficace per la tua situazione specifica. L'uso di una combinazione di tecniche è spesso la strategia più efficace. Ad esempio, utilizzando le transazioni con un livello di isolamento appropriato insieme al blocco ottimistico a livello di applicazione.

 

software © www.354353.com