Mål
-
Att lära sig vad I:et i ACID betyder
-
Att förstå hur lås fungerar, både binära lås och läs/skriv-lås
-
Att förstå några olika algoritmer för pessimistisk transaktionshantering:
tvåfaslåsning, strikt tvåfaslåsning, konservativ tvåfaslåsning
Bakgrund
Många databashanterare använder olika typ av lås för att hålla samtidiga transaktioner
isolerade från varandra (I:et i "ACID-transaktioner").
Med programmet
Locksim
kan man simulera transaktioner som läser och skriver data i en databas,
antingen med eller utan lås.
Om man använder lås kan man antingen använda enkla binära lås,
eller läs/skriv-lås.
Förberedelser
-
Läs lämpligt kursmaterial för att förstå de olika typerna av lås
och de olika låsalgoritmerna.
-
Man behöver tillgång till en programmeringsomgivning,
där man kan kompilera och köra programmet Locksim.
Visual Studio 2013 på Windows eller GCC på Linux bör fungera utan problem.
-
Ladda ner källkoden till programmet
Locksim
och kompilera programmet.
-
Inmatningen till Locksim är en fil med ett "scenario".
Ett scenario består av en databas och ett antal transaktioner som läser, skriver, låser och låser upp data i databasen.
I
beskrivningen
av Locksim finns två exempel:
dels (1) att Lotta och Kalle ger bort sina pengar till varann utan lås,
och dels (2) att Lotta och Kalle ger bort sina pengar till varann med tvåfaslåsning med läs/skriv-lås.
Kontrollera att du får samma resultat som står i beskrivningen.
(Locksim slumpar ordningen som transaktionerna körs i, så enskilda körningar kan ge olika resultat.)
Uppgiften
Här är några fel som kan uppstå när två eller flera transaktioner arbetar med samma data samtidigt:
-
Förlorade uppdateringar ("lost updates"),
så att en transaktion skriver över en ändring i databasen som en annan transaktion har gjort.
(För att det ska vara ett problem krävs att båda transaktionerna läser i databasen,
och sen baserar sina ändringar på samma lästa värden.)
-
Läsning av smutsiga data ("dirty reads"),
dvs att man läser data som en annan transaktion ändrat men ännu inte committat,
och kan rulla tillbaka.
(Eftersom Locksim inte har commit,
får man simulera en rollback med att ändra ett dataobjekt och sen ändra tillbaka till ursprungsvärdet.)
-
Oupprepbara läsningar ("nonrepeatable reads"),
dvs att man läser data som en annan transaktion sen ändrar och committar,
medan man jobbar med dem.
(Eftersom Locksim inte har commit,
får man simulera en commit med att ändra ett dataobjekt och helt enkelt inte ändra tillbaka till ursprungsvärdet.)
-
Inkonsistenta resultat, till exempel felaktiga summor.
(Det är en konsekvens av läsningsproblemen ovan.)
-
Spökposter.
(Man får simulera spökposter med att ha ett dataobjekt med värdet 0,
som betyder att det inte finns i databasen,
och sen ge det värdet 1, som betyder att det skapats i databasen.)
Och om man försöker förhindra dessa problem genom att låsa data, kan man få:
Skriv nu några scenarier och provkör i Locksim:
-
Gör först scenarier, utan lås, som demonstrerar vart och ett av isoleringsproblemen.
-
Komplettera nu de scenarierna med lås, så att problemen förhindras.
-
Visa i minst ett fall att det inte räcker att transaktionen låser data precis när den jobbar med det,
utan man måste använda tvåfaslåsning.
-
Visa i minst ett fall att man kan få deadlock.
Försök minska risken för deadlock.
Redovisning
Visa dina låsscenarior för läraren, demonstrera hur de fungerar i Locksim, och diskutera,
eller,
skicka
e-post
med fullständiga och tydliga beskrivningar av hur alltihop fungerar.
Om du skickar e-post med bilagor:
Vi har haft problem med överambitiösa virusfilter, som
utan att meddela det kastar bort mail med bilagor!
Det gäller särskilt Microsoft-drivna e-posttjänster
som @hotmail.com och @live.com.
För att överlista dem kan man döpa om Zip-filen från nånting.zip
till exempelvis nånting.info (inte nånting.txt).
Om du inte får svar så skicka gärna ett extra brev
(utan bilaga!) för att kontrollera om det första brevet kom fram.
|
Arbeta i grupper om en eller två studenter.
I undantagsfall kan man arbeta i grupper om tre, men fråga läraren först.
Det är tillåtet att samarbeta i större grupper än så,
men varje grupp om 1-3 studenter måste fortfarande redovisa separat,
och det måste också tydligt framgå (i rapporten eller på annat sätt)
vilka som deltog i samarbetet.
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
17 december 2015