Quali approcci e metodi utilizzerai per eliminare la concorrenza quando due utenti accedono contemporaneamente al database?
sobes.tech AI
Risposta dell'AI
Per evitare la concorrenza quando due utenti accedono contemporaneamente al database, vengono adottati i seguenti approcci:
-
Transazioni e blocchi — utilizzo di transazioni con un livello di isolamento adeguato al compito (ad esempio, Serializable, Repeatable Read). Questo aiuta a evitare conflitti durante la lettura e la scrittura dei dati.
-
Blocco ottimistico — durante l'aggiornamento dei dati, si verifica se sono cambiati dall'ultima lettura (ad esempio, tramite un campo di versione). Se sono cambiati, l'operazione viene annullata o ripetuta.
-
Blocco pessimista — blocco esplicito di righe o tabelle durante l'operazione, per impedire ad altri utenti di modificare i dati.
-
Utilizzo di operazioni atomiche — ad esempio, in alcuni DBMS, si possono usare comandi che garantiscono l'atomicità dell'aggiornamento.
-
Code e serializzazione delle richieste — se le operazioni sono critiche, si può organizzare una coda di richieste per modificare i dati.
Esempio con transazioni in Python usando la libreria psycopg2 per PostgreSQL:
import psycopg2
conn = psycopg2.connect(...)
try:
with conn:
with conn.cursor() as cur:
cur.execute("BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;")
cur.execute("SELECT balance FROM accounts WHERE id = %s FOR UPDATE;", (account_id,))
balance = cur.fetchone()[0]
new_balance = balance - amount
cur.execute("UPDATE accounts SET balance = %s WHERE id = %s;", (new_balance, account_id))
# La transazione viene automaticamente confermata
except Exception as e:
conn.rollback()
print("Errore nell'aggiornamento del saldo:", e)