Serializzabilità

Idealmente, le transazioni devono essere serializzabili. Le transazioni vengono chiamate serializzabili se i risultati dell'esecuzione simultanea delle transazioni sono gli stessi dei risultati dell'esecuzione seriale, vale a dire uno dopo l'altro. Non è importante quale transazione viene eseguita per prima, ma solo che il risultato non riflette alcuna combinazione delle transazioni.

Si supponga, ad esempio, che la transazione A moltiplica i valori dei dati per 2 e che la transazione B aggiunge 1 ai valori dei dati. Si supponga ora che siano presenti due valori di dati: 0 e 10. Se queste transazioni vengono eseguite una dopo l'altra, i nuovi valori saranno 1 e 21 se la transazione A viene eseguita per prima oppure 2 e 22 se la transazione B viene eseguita per prima. Ma cosa succede se l'ordine di esecuzione delle due transazioni è diverso per ogni valore? Se la transazione A viene eseguita per prima sul primo valore e la transazione B viene eseguita per prima sul secondo valore, i nuovi valori sono 1 e 22. Se questo ordine viene invertito, i nuovi valori sono 2 e 21. Le transazioni sono serializzabili se 1, 21 e 2, 22 sono gli unici risultati possibili. Le transazioni non sono serializzabili se 1, 22 o 2, 21 è un possibile risultato.

Perché è quindi consigliabile la serializzabilità? In altre parole, perché è importante che una transazione venga completata prima dell'avvio della transazione successiva? Si consideri il problema seguente. Un venditore immette gli ordini nello stesso momento in cui un impiegato invia le fatture. Si supponga che il venditore immissione di un ordine dalla società X, ma non ne esegue il commit; il venditore sta ancora parlando con il rappresentante dell'azienda X. L'impiegato richiede un elenco di tutti gli ordini aperti e individua l'ordine per la società X e invia loro una fattura. Ora il rappresentante della società X decide di voler modificare l'ordine, quindi il venditore lo modifica prima di eseguire il commit della transazione. La società X ottiene una fattura non corretta.

Se le transazioni del venditore e dell'impiegato fossero serializzabili, questo problema non si sarebbe mai verificato. La transazione del venditore sarebbe stata completata prima dell'avvio della transazione dell'impiegato, nel qual caso l'impiegato avrebbe inviato la fattura corretta oppure la transazione dell'impiegato sarebbe stata completata prima dell'avvio della transazione del venditore, nel qual caso l'impiegato non avrebbe inviato una fattura alla società X.