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 uno dopo l'altro. Non è importante che la transazione venga 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 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 la transazione B viene eseguita per prima. Ma cosa accade 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 è un possibile risultato.

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 allo stesso tempo un impiegato sta inviando fatture. Si supponga che il venditore immetta un ordine dalla Società X, ma non lo commetta; il venditore sta ancora parlando con il rappresentante della Società X. Il clerk richiede un elenco di tutti gli ordini aperti e individua l'ordine della Società X e li 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 erano serializzabili, questo problema non si sarebbe mai verificato. La transazione del venditore sarebbe stata completata prima dell'avvio della transazione dell'addetto, nel qual caso l'impiegato avrebbe inviato la fattura corretta o la transazione del clerk sarebbe stata terminata prima dell'avvio della transazione del venditore, nel qual caso il impiegato non avrebbe inviato una fattura alla Società X.