Oracle e SQL Server: Locking e Concorrenza

venerdì 28 marzo 2008 alle 28:07 | Pubblicato su SQL Server | 3 commenti

Uno dei punti di forza di Oracle è da molto tempo (credo dalle origini, quindi da quasi vent’anni) il meccanismo di gestione della concorrenza e delle consistenza nell’accesso dei dati. La descrizione dei concetti e dei meccanismi si può trovare nel capitolo 13 del manuale “Oracle Database Concepts”. In sostanza si tratta di meccanismi che permettono di implementare l’isolation level “READ COMMITTED” senza mai bloccare le letture e senza che i lettori blocchino i scrittori. Questo permette un’alta scalabilità perchè riduce i punti di serializzazione.

Si tratta di una caratteristica che da sempre rende Oracle superiore a sistemi avversari. Ad esempio anche Thomas Kyte nei suoi libri evidenzia il fatto che questo si può tradurre in differenti comportamenti dello stesso codice su database diversi.

Su SQL Server, ad esempio, che io sappia fino alla versione 2000, per ottenere lo stesso isolation level si utilizzano metodi di locking abbastanza pesanti, nel senso che i lettori bloccano gli scrittori e viceversa i scrittori bloccano i lettori. Una conferma di questo si ottiene leggendo questo articolo. Ora, per uno abituato a lavorare con Oracle e che conosce bene come si comporta Oracle questo sembra veramente incredibile e a me lo è sembrato tanto che la cosa mi ronza in testa da quando ho letto il libro di Tom Kyte l’anno scorso.

Il libro è stato pubblicato quasi tre anni fa è ho sempre pensato che in breve tempo, se non era già successo, Microsoft avrebbe colmato la lacuna migliorando il proprio prodotto. Anche perchè altrimenti non mi spiego la sempre maggiore diffusione di SQL Server.

Finalmente ho trovato il tempo e la voglia di espandere la mia conoscenza, anche per poter rispondere in modo corretto e completo a chi mi chiede perchè usiamo Oracle e non per il semplice motivo che Oracle è leader nel mercato.

Ho quindi collaudato quanto affermato in modo palesemente da Sean McCown pochi giorni fa: ho cercato informazioni su SQL Server. Il primo documento a cui sono arrivato è quello di Andrés Taylor, datato 30 Dicembre 2007. Il fatto che questo autore faccia apparire come eccezionale il fatto che uno che lavora con SQL Server da 6 anni voglia indagare sulle politiche di locking del database lascia già perplessi. In ogni caso l’autore non cita fin da subito la versione di SQL Server a cui fa riferimento, solo in seguito parla di SQL Server 2000 e l’articolo in effetti è alquanto datato, per cui ho continuato la mia ricerca seguendo il link a MSDN che l’autore mette nell’articolo.

Ho quindi collaudato la documentazione ufficiale di Microsoft che indubbiamente è ben fatta (anche se con Firefox non funziona perfettamente). Avendo ben chiaro quello che cercavo ho trovato abbastanza rapidamente ciò che mi interessava, prima sono arrivato al capitolo “Locking and Row Versioning del manuale SQL Server 2008, e poi al capitolo “Row Versioning-based Isolation Levels in the Database Engine“. In sostanza in questo capitolo o sezione si spiega come in SQL Server è stata introdotta una nuova caratteristica che permette una diversa implementazione dell’isolation level READ COMMITTED e un nuovo isolation level: “SNAPSHOT”. In realtà nella prima parte del documento c’è una nota con un link ad una versione precedente di questo documento che punta al manuale di SQL Server 2005. Quindi questa innovazione è stata portata con la versione 2005.

row versioning in SQL Server

Pare che in SQL Server, gia prima della versione 2005 fosse presente un meccanismo di row versioning che a spanne è simile al multi-versioning dei dati di Oracle (anche se dalla descrizione sembra essere ancora molto indietro rispetto alla tecnologia di Oracle). Questo meccanismo viene usato solo in casi particolari, per trigger, MARS e online indexing. Non ho ancora approfondito questi tre casi. Fra l’altro l’unico riferimento al row versioning nella documentazione si SQL Server 2000 che ho trovato è questo e quindi non ho capito molto. Facendo una ricerca su MARS ho trovato questo documento con questa affermazione: “Given the lack of MARS in SQL Server 2000…

READ_COMMITTED_SNAPSHOT

In conclusione la grossa innovazione di SQL Server 2005 consiste nel fatto che abilitando il parametro READ_COMMITTED_SNAPSHOT l’isolation level read committed viene implementato senza che i lettori blocchino gli scrittori e viceversa, in pratica come Oracle fa da un be po’ di tempo.

Vi è poi lo l’isolation level SNAPSHOT di cui forse parlerò un’altra volta.

3 commenti »

RSS feed for comments on this post. TrackBack URI

  1. Vorrei aggiungere due cose.

    La caratteristica “tutti bloccano tutti” è anche di mysql, tralasciando il motore innodb, che comunque è di proprietà Oracle e che limita l’utilizzo di mysql: c’è un “motore” proprio per tutti i gusti, ma nessuno è adeguato a un utilizzo generale. Altrimenti rimarrebbe solo quello.

    Il multi-versioning è invece una caratteristica base di PostgreSQL. Sto cercando ancora oggi di capire perché mysql è più diffuso di PostgreSQL.

  2. Ciao,
    sarà sicuramente un errore di battitura:

    “…parla di SQL Server 2000 e l’articolo in effetti è alcuanto datato…”

    forse

    alcuanto => alquanto

    Complimenti per il blog

    Saluti

    Emidio

  3. Rudy,
    grazie per aver portato l’esempio di Postgres e MySQL. Alle origini della mia carriera lavorativa ho con PHP e Postgres che veniva preferito nella mia azienda a MySQL. I veri motivi per cui gia al tempo fosse più diffuso MySQL di Postgres in effetti non li conosco perchè in effetti ho lavorato per oltre un anno con Postrgres ma senza conoscerlo veramente bene. Mi ricordo però che si differenziavano molto proprio sulla gestione delle transazioni, che in MySQL erano quasi un’optional.

    Emilio,
    grazie per i complimenti e per la segnalazione, ho provveduto a correggere.


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: