Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Isolamento | Acid
Ottimizzazione SQL e Funzionalità delle Query

Isolamento

Scorri per mostrare il menu

Nel contesto dei database, isolamento si riferisce alla capacità di un sistema di database di controllare la visibilità delle modifiche apportate da transazioni concorrenti. Garantisce che le transazioni operino in modo indipendente l'una dall'altra, evitando interferenze e mantenendo l'integrità dei dati.

Esistono 4 livelli di isolamento in SQL:

  • read uncommitted;
  • read committed;
  • repeatable read;
  • serializable.

Read uncommitted

Questo è il livello di isolamento più basso, in cui le transazioni possono vedere le modifiche apportate da altre transazioni anche prima che vengano confermate. Questo livello consente letture sporche, ovvero una transazione può leggere dati che sono stati modificati da un'altra transazione ma non ancora confermati.

Letture sporche

Note
Approfondimento

Una lettura sporca si verifica quando una transazione legge dati che sono stati modificati da un'altra transazione ma non ancora confermati.

Ad esempio, immagina due transazioni bancarie che avvengono simultaneamente: la Transazione A controlla il saldo del tuo conto mentre la Transazione B deposita denaro sul tuo conto. Se la Transazione A vede il saldo aumentato prima che la Transazione B sia terminata, si tratta di una lettura sporca, poiché il nuovo saldo potrebbe essere annullato se la Transazione B fallisce.

dirty+read

Implementazione

Per specificare il livello di isolamento per la transazione, è possibile utilizzare il seguente comando nella query:

-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

/* Transaction query */
COMMIT;
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Questa istruzione modifica il livello di isolamento per la transazione corrente a "Read Uncommitted", consentendo alla transazione di leggere potenzialmente dati modificati da altre transazioni non ancora confermate;

  • questo comando deve essere utilizzato solo all'interno del blocco di transazione! Altrimenti, non avrà alcun effetto e verrà utilizzato il livello di isolamento predefinito.

È anche possibile verificare il livello di isolamento corrente utilizzando il seguente comando:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Il livello di isolamento Read Committed garantisce che una transazione veda solo i dati che sono stati confermati da altre transazioni.
Ciò significa che le modifiche non confermate apportate da altre transazioni non sono visibili alle transazioni che operano con isolamento Read Committed.
Di conseguenza, impedisce le dirty read consentendo a una transazione di leggere solo dati confermati. Tuttavia, questo livello di transazione presenta problemi con le letture non ripetibili.

Letture non ripetibili

Note
Approfondimento

Una lettura non ripetibile si verifica quando una transazione legge la stessa riga più volte all'interno della stessa transazione, ma i dati recuperati cambiano tra una lettura e l'altra a causa di modifiche apportate da altre transazioni. Questa incoerenza può portare a comportamenti imprevisti e risultati errati.

Ad esempio, si immagini una transazione che interroga due volte il saldo di un conto cliente. La prima query restituisce $1000, ma prima che la transazione sia completata, un'altra transazione deposita $500 sul conto. Quando viene eseguita la seconda query, mostra $1500, portando a una lettura non ripetibile, in cui gli stessi dati vengono letti in modo diverso all'interno di una singola transazione a causa di modifiche apportate da un'altra transazione.

Il livello di isolamento "Read committed" consente letture non ripetibili perché blocca l'operazione di lettura sui valori che sono in fase di transazioni non confermate ma non blocca l'operazione di scrittura.
Di conseguenza, è possibile scrivere nuovi dati sulla riga che è attualmente letta da un'altra transazione.

Non-repeat-read

Aggiornamento perso

A causa dell'assenza del blocco di scrittura, esiste un ulteriore problema con il livello di isolamento read committed: aggiornamenti persi.

Note
Approfondimento

Un aggiornamento perso è una situazione nella gestione dei database in cui una transazione sovrascrive le modifiche apportate da un'altra transazione, causando la perdita di dati. Questo avviene tipicamente quando più transazioni cercano di aggiornare gli stessi dati contemporaneamente e le modifiche di una transazione vengono sovrascritte da un'altra prima che vengano confermate nel database.

Gli aggiornamenti persi si verificano quando due transazioni parallele tentano di modificare la stessa riga. Di conseguenza, la transazione che viene confermata per ultima sovrascrive i valori confermati dalle altre transazioni.

Lost_update

Implementazione

È possibile specificare questo livello di isolamento utilizzando i seguenti comandi:

-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

/* Transaction query */
COMMIT;

È importante notare che Read Committed è il livello di isolamento predefinito per la maggior parte dei sistemi di gestione di database, motivo per cui possiamo evitare di specificarlo.

question mark

Se una transazione legge dati che sono stati modificati da un'altra transazione non ancora confermata, che tipo di lettura è?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 6

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Isolamento

Nel contesto dei database, isolamento si riferisce alla capacità di un sistema di database di controllare la visibilità delle modifiche apportate da transazioni concorrenti. Garantisce che le transazioni operino in modo indipendente l'una dall'altra, evitando interferenze e mantenendo l'integrità dei dati.

Esistono 4 livelli di isolamento in SQL:

  • read uncommitted;
  • read committed;
  • repeatable read;
  • serializable.

Read uncommitted

Questo è il livello di isolamento più basso, in cui le transazioni possono vedere le modifiche apportate da altre transazioni anche prima che vengano confermate. Questo livello consente letture sporche, ovvero una transazione può leggere dati che sono stati modificati da un'altra transazione ma non ancora confermati.

Letture sporche

Note
Approfondimento

Una lettura sporca si verifica quando una transazione legge dati che sono stati modificati da un'altra transazione ma non ancora confermati.

Ad esempio, immagina due transazioni bancarie che avvengono simultaneamente: la Transazione A controlla il saldo del tuo conto mentre la Transazione B deposita denaro sul tuo conto. Se la Transazione A vede il saldo aumentato prima che la Transazione B sia terminata, si tratta di una lettura sporca, poiché il nuovo saldo potrebbe essere annullato se la Transazione B fallisce.

dirty+read

Implementazione

Per specificare il livello di isolamento per la transazione, è possibile utilizzare il seguente comando nella query:

-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

/* Transaction query */
COMMIT;
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Questa istruzione modifica il livello di isolamento per la transazione corrente a "Read Uncommitted", consentendo alla transazione di leggere potenzialmente dati modificati da altre transazioni non ancora confermate;

  • questo comando deve essere utilizzato solo all'interno del blocco di transazione! Altrimenti, non avrà alcun effetto e verrà utilizzato il livello di isolamento predefinito.

È anche possibile verificare il livello di isolamento corrente utilizzando il seguente comando:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Il livello di isolamento Read Committed garantisce che una transazione veda solo i dati che sono stati confermati da altre transazioni.
Ciò significa che le modifiche non confermate apportate da altre transazioni non sono visibili alle transazioni che operano con isolamento Read Committed.
Di conseguenza, impedisce le dirty read consentendo a una transazione di leggere solo dati confermati. Tuttavia, questo livello di transazione presenta problemi con le letture non ripetibili.

Letture non ripetibili

Note
Approfondimento

Una lettura non ripetibile si verifica quando una transazione legge la stessa riga più volte all'interno della stessa transazione, ma i dati recuperati cambiano tra una lettura e l'altra a causa di modifiche apportate da altre transazioni. Questa incoerenza può portare a comportamenti imprevisti e risultati errati.

Ad esempio, si immagini una transazione che interroga due volte il saldo di un conto cliente. La prima query restituisce $1000, ma prima che la transazione sia completata, un'altra transazione deposita $500 sul conto. Quando viene eseguita la seconda query, mostra $1500, portando a una lettura non ripetibile, in cui gli stessi dati vengono letti in modo diverso all'interno di una singola transazione a causa di modifiche apportate da un'altra transazione.

Il livello di isolamento "Read committed" consente letture non ripetibili perché blocca l'operazione di lettura sui valori che sono in fase di transazioni non confermate ma non blocca l'operazione di scrittura.
Di conseguenza, è possibile scrivere nuovi dati sulla riga che è attualmente letta da un'altra transazione.

Non-repeat-read

Aggiornamento perso

A causa dell'assenza del blocco di scrittura, esiste un ulteriore problema con il livello di isolamento read committed: aggiornamenti persi.

Note
Approfondimento

Un aggiornamento perso è una situazione nella gestione dei database in cui una transazione sovrascrive le modifiche apportate da un'altra transazione, causando la perdita di dati. Questo avviene tipicamente quando più transazioni cercano di aggiornare gli stessi dati contemporaneamente e le modifiche di una transazione vengono sovrascritte da un'altra prima che vengano confermate nel database.

Gli aggiornamenti persi si verificano quando due transazioni parallele tentano di modificare la stessa riga. Di conseguenza, la transazione che viene confermata per ultima sovrascrive i valori confermati dalle altre transazioni.

Lost_update

Implementazione

È possibile specificare questo livello di isolamento utilizzando i seguenti comandi:

-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

/* Transaction query */
COMMIT;

È importante notare che Read Committed è il livello di isolamento predefinito per la maggior parte dei sistemi di gestione di database, motivo per cui possiamo evitare di specificarlo.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 6
some-alt