Condividi tramite


Serializzabilità

Idealmente, le transazioni devono essere serializzabili. Le transazioni vengono considerate serializzabili se i risultati delle transazioni in esecuzione simultaneamente corrispondono ai risultati dell'esecuzione seriale, ovvero una dopo l'altra. Non è importante che la transazione venga eseguita per prima, ma solo che il risultato non rifletta alcuna combinazione delle transazioni.

Si supponga, ad esempio, che la transazione A moltiplichi i valori dei dati per 2 e la transazione B aggiunga 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, o 2 e 22 se viene eseguita per prima la transazione B. Cosa accade, invece, se l'ordine in cui vengono eseguite le 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 sono un risultato possibile.

Perché la serializzabilità è auspicabile? In altre parole, perché è importante che una transazione venga completata prima dell'avvio della transazione successiva? Si consideri il problema seguente. Un venditore sta immettendo ordini nello stesso momento in cui un impiegato sta inviando le fatture. Si supponga che il venditore immetta un ordine dalla Società X, ma non esegua il commit; il venditore sta ancora parlando con il rappresentante della Società X. L’impiegato richiede un elenco di tutti gli ordini aperti e individua l'ordine della Società X, a cui invia una fattura. Ora il rappresentante della Società X decide di modificare l'ordine, quindi il venditore lo modifica prima di eseguire il commit della transazione. La società X riceve una fattura errata.

Se le transazioni del venditore e dell'impiegato fossero state 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 o la transazione dell’impiegato sarebbe stata terminata prima dell'avvio della transazione del venditore, nel qual caso l’impiegato non avrebbe inviato una fattura alla Società X.