SimpleDB è un interessante progetto che ha portato alla realizzazione di un RDBMS (Relational Database Management System) in grado di supportare la maggior parte delle funzionalità del linguaggio SQL. Tra queste feature troviamo per esempio le transazioni, un Query Optimizer e un Query Parser, coprendo gran parte dei task previsti da applicazioni più complesse come per esempio MySQL.
Archiviazione dei dati e metodi di accesso
In SimpleDB i record sono indicati come tuple. Ognuna di esse si riferisce ad un insieme di campi che rappresentano i valori delle colonne di un riga. Attualmente però, gli unici tipi di campi supportati sono stringhe e interi. Le tuple che presentano lo stesso schema devono utilizzare lo stesso numero di byte indipendentemente dai valori dei campi.
Esse vengono memorizzate in pagine archiviate su disco. Ogni tabella del database è memorizzata come un'istanza di DbFile
che fornisce un'interfaccia per leggere e scrivere pagine e tuple sul disco di riferimento.
L'oggetto singleton Catalog
gestisce l'inserimento di nuove tabelle e la visualizzazione di schemi e chiavi primarie. BufferPool
gestisce invece accessi e modifiche alle pagine. Quest'ultimo ha una visione globale degli accessi e può memorizzare in cache le pagine utilizzate più frequentemente in modo che i loro recuperi non vengano archiviati sempre su disco.
Il supporto alle transazioni
In SimpleDB le transazioni vengono eseguite in parallelo. È quindi necessario il locking per evitare conflitti di dati tra transazioni eseguite contemporaneamente. Viene allora utilizzato il protocollo Strict Two-Phase Locking
(o 2PL) per il controllo della concorrenza e il blocco dei dati a livello di pagina.
Un LockManager fornisce supporto sia per i lock condivisi che per i lock esclusivi, in questo modo più lettori possono accedere agli stessi dati in parallelo. I lock vengono acquisiti quando una pagina viene recuperata da BufferPool
e la funzione di recupero delle pagine si blocca fino a quando il lock non viene acquisito dal LockManager. Esiste quindi il rischio di deadlock ma SimpleDB implementa anche un DependencyGraph
in grado di rilevarli.
Se dovesse essere innescato un deadlock, la transazione verrebbe abortita. In ogni caso tutti i lock detenuti da una transazione sarebbero rilasciati quando essa viene completata.
Per clonare il progetto è possibile accede al repository dedicato su GitHub. Mentre per ulteriori approfondimenti è disponibile un articolo pubblicato dallo stesso autore di SimpleDB.