Condividere documenti online, aggiungere foto agli album fotografici di un gruppo, o all'ultimo post del nostro blog... Diventa sempre più frequente la necessità di caricare dei file su un server e di tenerne contemporaneamente traccia su un database.
Se si affronta la cosa da sviluppatori, può emergere presto un'esigenza: quella di voler verificare sia il corretto aggiornamento del database, sia il successo dell'upload, nello stesso momento. Questo significa considerare il caricamento e l'aggiornamento del DB come un'unica operazione. Vediamo come risolvere il problema sfruttando il meccanismo delle transazioni, contemplate in ADO.NET.
Le transazioni
Una transazione nel gergo dei database è un insieme di operazioni che coinvolge più oggetti (tipicamente tabelle), che viene considerata come un'operazione unica.
Immaginiamo la situazione in cui due tabelle siano da aggiornare contemporaneamente. Ad esempio un form nel quale un utente inserisce sia dati relativi alle sue preferenze sul sito, sia i propri dati personali. È plausibile che l'amministratore di database abbia previsto due tabelle: una per i dati personali con accesso ristretto ed una seconda per le preferenze con diritti di accesso più blandi.
In casi come questi, occorre scrivere contemporaneamente sulle due tabelle per registrare correttamente l'utente e possiamo dire che la registrazione è andata a buon fine, solo se sicuri che entrambe le operazioni di scrittura abbiano avuto successo.
Questo, che per alcuni è stato un rompicapo (specie agli esordi dei DBMS) si risolve semplicemente con una transazione.
Possiamo descrivere il comportamento di una transazione con un semplice schema:
Schema di una transazione
Inizio della Transazione
<Operazione 1>
<Operazione 2>
...
<Operazione N>
Tutte le operazioni sono andate a buon fine?
SI --> Conferma tutte le operazioni (COMMIT)
NO --> Annulla tutte le operazioni (ROLL BACK)
Fine della Transazione
Come emerge dallo schema il successo della transazione è sancito dal comando COMMIT, mentre un ROLL BACK ripristina la situazione precedente all'inizio della transazione (riavvolge il nastro), assicurando la coerenza del database. Inoltre, durante tutta la transazione i record interessati non possono essere modificati da altri utenti.