Samtidighetskontroll i applikationer utvecklade med ASP.NET Web Forms och traditionell ADO.NET

Relevanta dokument
Föreläsning 7: Transaktioner

Karlstads Universitet, Datavetenskap 1

Transaktioner och samtidighet

Databasföreläsning. Del 2 lagrade procedurer, vyer och transaktioner

L0009B. Moment. Introduktion till geografiska databaser: G:\L0009B\Allmänt\IntroGeoDB.pdf (F)

Transaktionshantering med samtidighetskontroll i databaser

Databaser design och programmering. Transaktionshantering och säkerhet säkerhetsproblem fleranvändarproblem transaktioner låsning

SLUTRAPPORT RUNE TENNESMED WEBBSHOP

Projekt Rapport. RaidPlanner. Jeanette Karlsson UD10

Introduktion till Entity Framework och LINQ. Källa och läs mer

1DV405 - Databasteknik. Kursintroduktion. Så här är kursen planerad.

Databasutveckling Microsoft T-SQL - Fortsättning. Funktioner GROUP BY HAVING Skapa databaser Skapa tabeller Lite om transaktioshantering

ÖVERVAKNING AV SQL SERVER

Rune Tennesmed. Oskar Norling 1DV430. Individuellt Mjukvaruutvecklingsprojekt 1DV430 Webbprogrammerare H12 Oskar Norling

Beijer Electronics AB 2000, MA00336A,

WEBBAPPLIKATION FÖR ADMINISTRERING AV DOKUMENT

1DV405 - Databasteknik. Kursintroduktion. Så här är kursen planerad.

CMS, optimerade för programmerare Eller hur kan ett sådan skapas.

Manuell installation av SQL Server 2008 R2 Express för SSF Timing

Introduktion till MySQL

SQLs delar. Idag. Att utplåna en databas. Skapa en databas

Transaktioner. 1. Transaktioner 2. Samtidighet ( concurrency ) och lås. 3. Deadlock. Kap. 17. Informatik B: Databashantering med SQL Server

Tentamen, Distribuerade System/Programvaruarkitektur

1 Installationsinstruktioner

Installationsanvisning. Dokumenttyp Installationsanvisning Område Boss med delad databas

Mål med lektionen! Veta kursmålen. Ha kännedom om några av de grundläggande begreppen.

Stored procedure i ASP.NET

Tentamen ISGB01 (delkurs i ISGB24) Databasdesign 7,5 Poäng

SEB. Four foils. SEB IT Lars-Göran Karlsson

Föreläsning 6 Databaser och säkerhet

Henrik Häggbom Examensarbete Nackademin Våren 2015

Alternativ till låsning. Optimistik approach TimeStamp

Kopiering av objekt i Java

Institutionen för Tillämpad fysik och elektronik Stefan Berglund och Per Kvarnbrink. Laboration: Flerskiktade applikationer

Databaser - Design och programmering. Säkerhetsproblem. SQL-injektion. Databashanteraren. Transaktion. Exempel. Transaktionshantering och säkerhet

VAD GÖR DU / VEM ÄR DU?

Idag. Hur skapar vi och underhåller en databas? DD1370 (Föreläsning 4) Databasteknik och informationssystem 7,5 hp Hösten / 20

Migrering av applikationen AMM till molnet

Databaser design och programmering Säkerhetsproblem Databashanteraren SQL-injektion

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Manuell installation av SQL Server 2008 R2 Express SP2 fo r SSF Timing

GIT L0009B GEOGRAFISK DATABASTEKNIK. Information inför kursstart

Skriv ditt sökord i sökrutan och markera rutan för att föreslå ämnesord (Suggest Subject Terms).

Säkra pausade utskriftsjobb. Administratörshandbok

Mål med lektionen! Repetera och befästa kunskaperna.

1 Installationsinstruktioner

Cache coherence hos multicoreprocessorer

DVA234 Databaser. Dag Nyström, Introduktion till databaser och MS SQL Server

Laboration: SQL Server

VAD GÖR DU / VEM ÄR DU?

Inledande programmering med C# (1DV402) Introduktion till. eller så här är det tänkt att fungera.

TNK046 GIS - Databaser Laborationsuppgift 1 Introduktion till Microsoft Access 2007

Installationsanvisningar HogiaLön Plus

Lösningar till tentamen i EDAF75

Stored procedure i ASP.NET

Filsäkerhet i Windows NT (NTFS)

Uppstart Inloggning SSMS Skapa Databas Skapa Tabell Skapa Diagram, Fk, RI Hantering av Index, Pk, Fk, Ix Constraints Beräknande fält Några funktioner

Beställa varor från webbutiken för provtagningsmateriel, remisser och övrigt materiel.

KAP 16 BACKUP, RESTORE OCH RECOVERY

Titel Mall för Examensarbeten (Arial 28/30 point size, bold)

Trimble Communication Network Release notes Page 1

Klientprogrammering mot databaser

Databashantering och Beslutsstöd

Beställa varor från webbutiken för provtagningsmateriel, remisser och övrigt materiel.

LEX INSTRUKTION REPLIKERING UPPGRADERING

Databaser & databasdesign. Personuppgiftslagen, säkerhet och transaktioner.

Relationsdatabashanteringssystem RDBHS

What Is Hyper-Threading and How Does It Improve Performance

MESI-protokollets funktion i multiprocessorer

Lab 6: ASP.NET 2.0 Providermodellen

Det är fullt tillåtet att göra laborationen innan laborationstillfället.

Beställa varor från webbutiken för provtagningsmateriel, remisser och övrigt materiel.

2.1 Installation of driver using Internet Installation of driver from disk... 3

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

LUPstudentpapers. Manual Reviewer

SLUTRAPPORT WEBBPROJEKT 1

Att skriva till och läsa från terminalfönstret

KAP 18 SQL SERVER AGENT

Laboration 2, MS SQL. Observera. Tips. Förberedelse. Genomförande

Individuellt Mjukvaruutvecklingsprojekt

Lathund för studenter

JavaRats. Kravspecifikation. Version 1.1. Gustav Skoglund Marcus Widblom Senast ändrad: 13 / 05 / 08

Säkerhetskopiering - SQL

Logging Module into the PRIME Core

1DV423 Databas med Administration

Flytt av. Vitec Mäklarsystem

Rapport (1,5 HP) Lunds Universitet HT15

Innehåll. MySQL Grundkurs

! Webprogrammering. ! Databasteori och praktik. ! Fö, le, la + projekt. ! Examination (tenta, dugga + labb, ! Studera användarna och deras problem

QC i en organisation SAST

(7) Neptune Version release information. Copyright Visma. Med ensamrätt.

WEBBSERVERPROGRAMMERING

Se kurshemsidan för användbara länkar för att genomföra denna laboration.

Webbtjänster med API er

Innehåll. Dokumentet gäller från och med version

Felhantering TDDD78, TDDE30, 729A

Webbserverprogrammering

Hogia Personal version ( )

Microsoft Access. Skapa en ny databas. Östersund Vårterminen 2005

Transkript:

Examensarbete Samtidighetskontroll i applikationer utvecklade med ASP.NET Web Forms och traditionell ADO.NET Gunnar Annerstedt, Madeleine Landerhjelm 2012-05-23 Ämne: Datavetenskap Nivå: G1E Kurskod: 1DV40E

Abstrakt/ Abstract Samtidighetskonflikt, även känt under den engelska termen concurrency conflict, uppstår när två eller flera processer försöker uppdatera samma information i en databas vid samma tidpunkt. Processen som sparar ändringarna sist blir de ändringar som gäller och på så sätt kan viktigt information försvinna. Det finns flera tillvägagångssätt för att förhindra dessa problem med olika typer av samtidighetskontroller som kan ske i applikationen eller redan på databasnivå via lagrade procedurer. Metoden som används för att undersöka problemområdet har utgått från ett praktiskt arbete med en utökning av en existerande applikation, webbutiken RoyalDesign, skriven i ASP.NET (ASP-dotnet) Web Forms. Utökningen kräver samtidighetskontroll där användaren ska informeras av eventuella konflikter. Undersökningen avser att granska hur samtidighetskontroll implementeras och hanteras i applikationen. Resultatet av undersökningen visar databasen gör den största delen av arbetet, fångar samtidighetskonflikter samt kastar ett undantag som sedan applikationen fångar och hanterar. Nyckelord: Samtidighetskontroll, samtidighetshantering, samtidighetskonflikt, timestamp, rowversion Concurrency conflict occurs when two or more processes tries to update the same information in a database at the same time. The process that saves the changes last overwrites the others and therefore important information may be lost. There are different ways to approach these problems with different types of concurrency control that may occur in the application itself or in the database through stored procedures. The Method that is used to examine concurrency conflict is based on a practical assignment with an extension of an existing application, the webshop RoyalDesign, developed in ASP.NET (ASP-dotnet) Web Forms. The extension requires concurrency control and the user has to be informed of possible conflicts. The examination intends to check how concurrency control is implemented and handled in the application. The result of the examination shows that the database is doing the biggest part of the workload, catches concurrency conflicts and throws an exception that the application catches and handles. Keywords: Concurrency control, concurrency handling, concurrency conflict, timestamp, rowversion

Förord Detta examensarbete är på B-nivå och ingår i utbildningen Webbprogrammerare på Linneuniversitetet i Kalmar. Den praktiska delen av arbetet har utförts hos RoyalDesign i Kalmar. Vi vill tacka vår handledare Mats Loock för all hjälp under arbetets gång samt Hans Bengtsson, Andreas Ekberg, Dan Axelsson och de andra på RoyalDesign för att de gav oss möjligheten att arbeta hos dem.

Innehållsförteckning Abstrakt/ Abstract... I Förord...II 1. Bakgrund... 1 1.1 Introduktion till problemområdet 2 1.1.1 Förlorade uppdateringar 3 1.1.2 Uncomitted dependency 3 1.1.3 Oupprepbara läsningar 3 1.2 Tidigare forskning 4 1.3 Avgränsningar 4 1.4 Lösningar 5 1.4.1 Pessimistisk hantering (pessimistic concurrency) 5 1.4.2 Optimistisk hantering (optimistic concurrency) 6 1.4.3 Tidsstämpling 6 1.4.4 ACID (Atomicity Consistency Isolation Durability) 7 1.4.5 Upprepbarhet (Serializability) 7 1.5 Samtidighetskontroll i Entity Framework 7 1.6 Vald lösning 8 2. Metod... 9 2.1 Metoddiskussion 9 3. Genomförande...11 4. Resultat... 12 4.1 Databas 12 4.2 Lagrade procedurer 12 4.3 Applikationen 13 5. Slutsats... 16 6. Fortsatt forskning... 17 7. Källförteckning... 18

1. Bakgrund RoyalDesign 1 ska utöka den redan existerande webbapplikationen med ny funktionalitet. Användare ska kunna registrera sig för att få möjligheten att skapa önskelistor som de sedan fyller med artiklar från den redan existerande webbutiken. Produkterna sparas när användaren väljer att lägga till dem i önskelistan via en knapp på varje enskild produktsida. Inloggade användare ska kunna använda sig av CRUD-funktionalitet 2 (Create Read Update Delete) för att kunna ändra innehållet i sina önskelistor, men även ta bort önskelistor helt om så önskas. Den nya funktionaliteten som införs kräver att applikationen både skickar och tar emot information från den existerande webbshopen och dess tabeller i databasen, och använder den för att skapa och spara information i nya tabeller som tas fram i samband med att utökningen implementeras. Varje önskelista som sparas erhåller en unik url som skaparna av listan kan skicka vidare till de inbjudna gästerna. Gäster som går in på önskelistan ser de artiklar som önskas och det antal som återstår att köpa. De kan sedan välja en eller flera artiklar samt antal innan de går vidare för att slutföra köpet. Vid ett köp följer applikationen det existerande flödet i applikationen och användaren skickas vidare till den existerande kundkorgen. Innan köpet slutförs sker en samtidighetskontroll mot databasen för att kontrollera om en annan gäst, eller skaparen av listan, har ändrat antalet av produkter som återstår att köpa. Detta förhindrar att fel produkt eller fel antal av en produkt köps. Flera transaktioner mellan applikationen och databasen kräver samtidighetshantering för att undvika att konflikter uppstår, exempelvis att fel antal artiklar köps om uppdateringar går förlorade. Hur samtidighetskontrollen implementeras skapar den problemställning som denna rapport ämnar svara på. I en applikation hanteras samtidighetskontroll i första hand i databasen med hjälp av ett värde som definierar vilken version raden har. Detta värde kallas även för tidsstämpel och benämns ofta med den engelska termen rowversion som består av ett unikt värde, till exempel ett slumpat binärt tal. Tidsstämpeln används för att få en unik version av databasraden som används vid jämförelser. I en tabell kan det enbart finnas en tidsstämpel för varje rad och när ett objekt uppdateras ändras även tidsstämpeln till ett nytt slumpat värde. Vid en uppdatering av en rad i databasen jämförs 1 http://www.royaldesign.se/ 2 http://en.wikipedia.org/wiki/create,_read,_update_and_delete 1

värdet på tidsstämpeln som lästes in av applikationen mot det aktuella värdet i databasen. Om värdena inte stämmer överens uppstår en samtidighetskonflikt och uppdateringen avbryts. [1] I en databas med mycket transaktioner där data ändras eller tas bort är det relevant att använda sig av samtidighetskontroll. Uteblir samtidighetskontrollen uppstår risken att viktig information går förlorad vilket i sin tur kan få stora konsekvenser. Det finns flera olika problem som kan lösas med samtidighetshantering. Den vanligast förekommande konflikten är förlorade uppdateringar, även kallat lost modifications, där uppdateringar skriver över varandra och på så sätt förloras. [2] Som en del i arbetet har en applikation utvecklats för att undersöka implementation av samtidighetskontroll. När flera användare modifierar information i databasen via applikationen samtidigt görs en samtidighetskontroll för att undvika samtidighetskonflikt. Om värdet som lästes in av applikationen stämmer överens med värdet i databasen genomförs modifieringen, annars informeras användaren att det har uppstått en samtidighetskonflikt och uppdateringen avbryts. [3] Applikationen skrivs i ASP-dotnet Web Forms och delas upp i fem olika lager; användargränssnitt-, presentationslogik-, affärslogik-, dataåtkomst- och datalager, där traditionell ADO-dotnet används i dataåtkomstlagret. 1.1 Introduktion till problemområdet I en applikation med funktionalitet som kommunicerar med en databas finns det risk att det uppstår olika typer av samtidighetskonflikter när en eller flera processer påverkar data i databasen samtidigt. Sannolikheten att denna typ av konflikter inträffar ökar i takt med att användarantalet växer, eftersom antalet samtidiga anslutningar som tävlar om att få uppdatera blir större. [4] I den utökning som utvecklas kan samtidighetskonflikt tänkas uppstå när flera gäster ska köpa en och samma artikel samtidigt. Exempelvis har ett brudpar skapat en lista där de bland annat önskar sig tio exemplar av ett specifikt vinglas. Två gäster, Gäst A och Gäst B, tittar därefter samtidigt på listan och har läst in samma information från databasen. De ser att brudparet önskar sig dessa tio vinglas och vill köpa några av dem. Gäst A väljer att lägga sex stycken utav dessa vinglas i sin kundkorg medan Gäst B väljer att beställa åtta exemplar av samma artikel. När Gäst A väljer att genomföra sitt köp uppdateras databasen och antalet vinglas som återstår att köpa i listan ändras till fyra. Gäst B som fortfarande har den äldre versionen av objektet, från databasen, genomför kort därefter sitt köp i tron om att det fortfarande återstår att köpa tio vinglas. När köpet genomförs uppdateras informationen i databasen igen och skriver på så sätt över den uppdatering som Gäst A gjorde. En konflikt har uppstått utan att Gäst A eller Gäst B har påverkats. Problemen uppstår istället i 2

form av att båda gästerna köper sitt valda antal av produkten och totalt fjorton vinglas skickas till brudparet, detta problem omnämns ofta som felaktiga summor. Som nämnt ovan skriver även det sista köpet över den uppdateringen av artikeln från Gäst A:s köp och tar endast bort de åtta vinglas från de ursprungliga tio som brudparet önskade sig, även kallat förlorad uppdatering. Resultatet av de två genomförda köpen blir således att listan visar att det återstår att köpa två vinglas av de ursprungliga tio trots att fjorton redan har skickats till brudparet. Konflikter som uppstår måste således förhindras via samtidighetskontroller i applikationen samt databasen. RoyalDesigns förhoppningar är att ett stort antal användare ska använda sig av utökningen och skapa listor för olika evenemang. Ett stort antal användare innebär ett ännu större antal gäster och potentiella köp, vilket i sin tur leder till åtskilliga anrop mot databasen som potentiellt kan orsaka samtidighetskonflikter. I och med detta är det viktigt att en förståelse kring varför konflikter uppstår och hur de förhindras bildas och används i utvecklingen av applikationen. 1.1.1 Förlorade uppdateringar Förlorade uppdateringar, från engelskans benämning lost modifications, är en samtidighetskonflikt som kan inträffa när flera användare uppdaterar samma rad i databasen. Konflikten uppstår då samma data från databasen läses in, i exempelvis ett formulär, där det sedan går att modifiera data innan den sparas om. Läser flera användare in samma version av data så är det versionen från den användare som sparar sist som skriver över alla andras och på så sätt går uppdateringarna förlorade. [4] 1.1.2 Uncomitted dependency Uncomitted dependency, eller dirty read, uppstår när en process läser in data från en rad som håller på att uppdateras. Det som läses in har med andra ord inte sparats än och kan ändras och bör därför inte användas. [5] 1.1.3 Oupprepbara läsningar Oupprepbara läsningar (Non-repeatable read) inträffar när en process läser samma rad från databasen flera gånger och mellan läsningarna så uppdateras raden i databasen av 3

en annan process. Resultatet blir att läsningarna som görs inte kan återskapas då de skiljer sig från varandra, de blir oupprepbara. [5] 1.2 Tidigare forskning Tidigare forskning kring samtidighetshantering som har studerats koncentrerar sig i stor utsträckning på transaktioner och hur man ska hantera situationen om det är två eller fler transaktioner samtidigt av samma objekt. Själva samtidighetskontrollen sker oftast på databasnivå via lagrade procedurer, sedan skiljer sig tillvägagångssättet mellan olika programmeringsspråk när det kommer till hur eventuella konflikter hanteras och meddelas i applikationen för användaren. Ett vanligt tillvägagångssätt är att använda sig av tidsstämpling i databasen. Vid pessimistisk hantering, som förklaras under lösningar, är tvåfaslåsning den vanligaste låsningen som används då denna oftast är standard i många databaser. [3] 1.3 Avgränsningar Applikationen ska använda sig av en registrerings- och inloggningsfunktion. För att kunna fokusera mer på problemställningen görs registrerings- och inloggningsfunktionen mycket enkel utan betoning på säkerhet. Avgränsningen är godkänd av uppdragsgivaren då de anser att det är viktigare att få övrig funktionalitet att fungera samt de idag har flera olika inloggningssystem för sitt administrationsgränssnitt och vill inte riskerar att det blir några konflikter dem emellan. Innan applikationen läggs upp i skarp miljö kommer uppdragsgivaren istället skriva egen registreringsoch inloggningsfunktionalitet eller göra om någon av de existerande. Prioriteringen i applikationen kommer att läggas på skapande av önskelistor och kringliggande funktionalitet med prioritering på samtidighetshantering vid eventuella samtida köp av en och samma artikel, eller när en användare uppdaterar en existerande önskelista. I utvecklingsmiljön finns inte den existerande kundkorgen med alla steg av köpsekvensen tillgänglig. Istället kommer den tänkta transaktionen med samtidighetskontroll som sköter en önskelistas artiklar köras direkt när någon väljer att lägga artiklar i varukorgen för att testa att samtidighetskontrollen fungerar utan tillgång till den rätta köpsekvens. 4

1.4 Lösningar För att undvika samtidighetskonflikter i databasen kommer en jämförelse göras mellan det inlästa objektet och dess tidsstämpel i applikationen med den tidsstämpel som finns i databasen. Samtidighetskontroll kommer att göras då köparen väljer att lägga en artikel i kundkorgen eller användaren ändrar någon del av önskelistan. Uppstår det en samtidighetskonflikt informeras användaren eller köparen om detta och de ombeds ladda om informationen för att se de aktuella ändringarna. 1.4.1 Pessimistisk hantering (pessimistic concurrency) Pessimistisk hantering innebär att poster låses på olika sätt när en process ska läsa från databasen så att ingen annan process ska kunna modifiera eller läsa posten vid samma tidpunkt, det antas att samtidighetskonflikter kommer att inträffa. En annan process kan inte samtidigt använda sig utav låset. Däremot kan olika processer utföra låsningen på skrivskyddet men de kan inte uppdatera posten förens det är deras tur. Låsningen innebär att det bara är en hantering som kan ske vid ett och samma tillfälle. Med hjälp av olika låsningstyper kan samtidighetskonflikter förhindras. [6] 1.4.1.1 Binär låsning Binär låsning innebär att databasen låser objekt när en process gör ändringar. Låset är aktivt tills processen är klar och därefter blir objektet olåst tills nästa process vill göra ändringar i objektet och låser det på nytt.[3] 1.4.1.2 Läslås Med ett läslås kan flera processer läsa av samma objekt samtidigt. Läslås gör så att processen inte kan uppdatera objektet utan det går enbart att läsa informationen som det innehåller. Ett läslås kan även omvandlas till ett skrivlås. För att omvandla läslåset till skrivlås måste det först kontrolleras att ingen annan process har låst objektet. Därefter sker omvandlingen och låstypen ändras. [3] 1.4.1.3 Skrivlås När objektet har ett skrivlås kan processen både uppdatera och läsa information från objektet. Om någon annan process vill komma åt objektet under samma period kan denna process varken läsa eller uppdatera objektet. Utan denna process måste vänta tills den föregående är klar och låser upp skrivlåset. [3] 5

1.4.1.4 Tvåfaslåsning Tvåfaslåsning består av två stycken olika faser, den växande fasen och den krympande fasen. I den växande fasen blir alla lås låsta medan de senare låses upp i den krympande fasen. Ett problem som kan uppstå vid användning av tvåfaslåsning är deadlocks. Deadlocks innebär att processer ställs på kö för att kunna låsa upp ett objekt och ta ut information ifrån det. Det är enbart en process som har tillgång till objektet vid ett och samma tillfälle. För att undvika deadlocks används wait/die-principen vilket innebär att den äldre processen väntar om en nyare process har låst objektet. När en nyare process väntar på en äldre process kommer det att göras en rollback på den nyare processen så den avbryts. Wound/wait är motsatsen till detta och här är det den äldre processen som får göra en rollback om den väntar på en yngre process. [3] 1.4.1.5 Exklusivt lås När enbart en process har tillgång till objektet kallas det för exklusivt lås. När processen är klar öppnas den för en annan process. Detta innebär att det kommer att bli en väntan på att få tillgång till objektet om det är låst av en annan process. [3] 1.4.2 Optimistisk hantering (optimistic concurrency) Optimistisk hantering görs då det kan komma att inträffa en samtidighetskonflikt men man antar att det inte kommer att göra det och därav låser man inga poster. Istället sker en samtidighetskontroll precis innan ändringar sparas. Om det inte har skett någon förändring kommer processen att fortsätta. Om däremot det har skett en förändring avbryts processen. Vid optimistisk hantering sker ingen typ av låsning i databasen. [7][8] 1.4.3 Tidsstämpling Rader i en databas kan tilldelas ett fält specificerad för tidsstämpling, i SQL 3 används ofta datatypen timestamp för detta ändamål. Tidsstämpling innebär att varje rad i databasen erhåller ett unikt värde som indikerar dess version. Tidsstämplingen fungerar 3 http://en.wikipedia.org/wiki/sql 6

som en räknare och vid en uppdatering jämförs det värde som processen hämtat ut med det som står i databasen när uppdateringen skall genomföras. Om värdena inte stämmer överens med varandra betyder det att en nyare version av raden finns och processen kan då inte fullföljas. Genomförs uppdateringen uppdateras värdet på tidsstämplingen. [9] 1.4.4 ACID (Atomicity Consistency Isolation Durability) ACID är en princip som kan används vid olika transaktioner i samband med samtidighetskontroll. Atomicity innebär att allt kommer att genomföras. Consistency innebär att databasen kommer att hålla samma tillstånd. Isolation innebär att en process resultat inte ska vara beroende av andra processer. Vilket innebär att databasen ska hantera flera processer samtidigt och låsa vissa processer tillfälligt. Durability står för hållbarhet. Om serverns skulle gå ner så ska processen kvarstå. Denna process ska alltså inte kunna förloras om ett fel skulle inträffa senare.[10][9] 1.4.5 Upprepbarhet (Serializability) Samtidighetsprotokoll (concurrency control protocol) har som mål att planera hur de olika processerna undviker att resultera i en konflikt. Processerna kan köras seriellt men det blir svårare då de ska köras parallellt. Upprepbarheten kontrollerar så att det inte har skett någon ändring i databasen. Ett exempel på detta kan vara att två processer kan läsa av ett objekt i en databas samtidigt utan att det sker en konflikt. Likaså om två processer läser olika objekt eller ändrar i olika objekt i databasen sker inte en konflikt. Om det däremot skulle vara så att två processer läser eller uppdaterar samma objekt i databasen samtidigt uppstår en konflikt som bör tas hand om. [2] 1.5 Samtidighetskontroll i Entity Framework I senare versioner, från version 3.5 och framåt, av dotnetramverket som använder sig av ADOdotnet Entity Framework 4 är specifik funktionalitet för samtidighetskontroll implementerad. Entity Framework använder sig av optimistisk samtidighetsmodell som standard och objekt sparas utan att kontrollera om en samtidighetskonflikt har inträffat samt att ingen typ av låsning 4 http://msdn.microsoft.com/en-us/library/bb399572.aspx 7

sker. Genom att använda sig av attributet ConcurrencyMode och sätta värdet till fixed gör ramverket en samtidighetskontroll innan ändringarna sparas i databasen. Upptäcker ramverket en samtidighetskonflikt kastas ett undantag av typen OptimisticConcurrencyException. Definieras en datamodell som använder sig av lagrade procedurer kastas samma typ av undantag om den lagrade proceduren rapporterar tillbaka att inga rader påverkades. Inträffar en samtidighetskonflikt när ändringar ska sparas är en lösning att kalla på Refresh för att uppdatera innehållet i objektet samt specificera om innehållet i objektet skall behålla de inmatade värdena från användaren, ClientWins, eller återgå till de aktuella värdena från databasen, StoreWins. [11] 1.6 Vald lösning I det praktiska arbetet med applikationsutökningen används optimistisk hantering samt tidsstämpling vid hanteringen av samtidighetskontroll. Anledningen till valet av dessa lösningar grundar sig på att applikationen inte kommer att vara så högt belastad så att en låsning kommer att krävas. I den redan existerande applikationen används inte Entity Framework, utan traditionell ADO-dotnet, vilket medför att den nya applikationen inte kan använda sig utav funktionen för samtidighetskontroll som följer med senare versioner av dotnetramverket. Samtidighetshantering måste därmed implementeras på egen hand. Den databas som uppdragsgivaren använder sig av är av typen Microsoft SQL Server och varför tidsstämplingen hanteras med hjälp av fält med datatypen timestamp. 8

2. Metod Hur samtidighetskontroll implementeras i en applikation skapad med ASP-dotnet Web Forms och ADO-dotnet kommer att besvaras genom att studera tidigare publicerat material i ämnet för att sedan använda den informationen i utvecklingen av en applikation. Det praktiska arbetet fungerar som testmiljö för att se hur samtidighetskontroll fungerar och om det går att föra in i applikationen på olika sätt. Information kring samtidighetskontroll samlas in via olika webbsidor, rapporter samt litteratur. Den insamlade informationen kommer att jämföras med varandra för att finna den bästa lösningen för applikationen samt angripa den från olika håll. Kommer olika tekniker fram under informationsinsamlingen, som skiljer sig i tillvägagångssättet, ställs de mot varandra och för- och nackdelar jämförs tills rätt tekniker uppfyller applikationens ändamål. Utvecklingen av applikationen, som är en påbyggnad av en existerande applikation, sker lokalt hos uppdragsgivare med en kopia av deras nuvarande databas och webbapplikation. Utökningen av applikationen som tas fram kommer att innehålla produkter från uppdragsgivarens databas samt information som lagras i nya tabeller i databasen som skapas specifikt för ändamålet. Applikationen skrivs i ASP-dotnet Web Forms och traditionell ADO-dotnet och utökningen av databasen görs i SQL Management Studio 5 som är en databashanterare. 2.1 Metoddiskussion Applikationen utvecklas i samråd med uppdragsgivare där det finns en begränsad tidsram samt att annan funktionalitet förutom samtidighetskontroll ska finnas med. Dessa faktorer kommer medföra att testningen av antalet olika tekniker som uppfyller ändamålet kommer att vara begränsad. Fokus läggs istället på den teknik som är väl dokumenterad och uppfyller ändamålet på ett lämpligt sätt. Även om problemställningen fokuserar på hur samtidighetskontroll implementeras i applikationer utvecklade i ASP-dotnet Web Forms och ADO-dotnet hade det med fördel även kunnat tas upp hur samtidighetskontroll fungerar i andra programmeringsspråk samt ramverk. En sådan undersökning hade medfört en bredare förståelse hur problemet kan angripas i olika utvecklingsmiljöer och vilka skillnader det finns mellan språk, som ASP-dotnet Web Forms utan 5 http://msdn.microsoft.com/en-us/library/ms174173.aspx 9

Entity Framework, där samtidighetskontroll måste formas själv och språk där stöd för samtidighetskontroll är med från början. På samma sätt hade det kunnat tas upp hur samtidighetskontroll sker inom olika typer av databaser för at få en bättre insikt i hur de skiljer sig åt och om någon typ av databas är mer lämpad gällande samtidighetskontroll. 10

3. Genomförande Publicerat material angående samtidighetskontroll i applikationer utvecklade med ASP-dotnet Web Forms och ADO-dotnet fokuserar till stor del på utformandet av databasen och dess lagrade procedurer samt hur applikationen uppfattar eventuella konflikter som uppstår, fångar in dessa och hanterar dem. Tillvägagångssätten i det material som studerades inom ämnet är väldigt snarlika varandra och skillnader återfanns oftast i hur avancerade de lagrade procedurerna är då det inom dessa det mesta av arbetet kring samtidighetskontroll sker. Resultatet av den bristande variationen av tillvägagångssätt ledde till att den planerade jämförelsen och testningen av olika tekniker ej blev genomförd som planerat. Utvecklingsmiljön från uppdragsgivaren blev försenad vilket resulterade i att implementation samt testning av samtidighetskontrollen blev begränsad för att finna tid till att färdigställa annan funktionalitet i applikationen som uppdragsgivaren krävde. Tillsammans med bristen på material som behandlar frågeställningen på olika sätt resulterade detta i att fokusering under utvecklingen ledde oss mot att få fram en så enkel och funktionell samtidighetskontroll som möjligt. 11

4. Resultat För att undvika konflikter använder applikationen sig utav tidsstämpling och optimistisk hantering utan låsning av poster i databasen. Vid användning av låsning kan det uppstå kö för att kunna få läsa från objektet. Det förväntade användarantalet är inte så pass stort samt data som påverkas är inte så känsligt att låsning är befogat. 4.1 Databas Utökningen av applikationen medför att nya tabeller introduceras till databasen. Totalt skapas fem nya tabeller för att sköta önskelistan, artiklarna i önskelistan, önskelistans adress, vilken typ av önskelista det är samt en tabell för enkel användarhantering. Två av dessa tabeller, som sköter önskelistan samt önskelistans artiklar, innehåller en kolumn av datatypen timestamp med titeln objectversion för samtidighetskontroll (se figur 1.1). I sql är datatypen timestamp ett binärt värde som är garanterat unikt i databasen och uppdateras med varje ny version av en specifik rad. [1] Figur 1.1 Ny databastabell med objectversion av typen timestamp Dessa värden används sedan och jämförs i samtidighetskontrollen för att utesluta eventuella samtidighetskonflikter. 4.2 Lagrade procedurer De lagrade procedurer som hanterar någon typ av ändring i de två tabeller som sköter önskelistorna och deras innehåll behöver även hantera samtidighetskontrollen. Kontrollerna sker genom att de lagrade procedurerna tar emot ett objekt från applikationen innehållande relevant information för det gällande objektet, i de flesta fall räcker det med primärnyckeln samt tidsstämpeln. I de tabeller som lades till i databasen för att uppfylla utökningens funktionalitet tilldelades vissa tabeller ett fält för tidsstämpling som döptes till objectversion av typen 12

timestamp. Den lagrade proceduren utför sedan en kontroll genom att jämföra värdet på objectversion i objektet som applikationen läste in och skickade in med det aktuella värdet på objectversion i databasen. Om det är samma värde på versionen genomförs ändringarna i databasen vilket i sin tur innebär att uppdateringar av innehållet i listorna eller köp slutförs samt att objectversion uppdateras till ett nytt slumpat binärt tal. Om det däremot är olika värden på versionerna av objectversion har en konflikt inträffat. Vid en eventuell konflikt avbryts uppdateringen av tabellen och ett undantag kastas som applikationen kan ta emot och hantera.[4] (se figur 1.2) Figur 1.2 Lagrad procedur med samtidighetskontroll 4.3 Applikationen Då den ursprungliga applikationen inte använder sig av ADO-dotnet Entity Framework har den heller inte något stöd för samtidighetskontroll inbyggt som standard. Samtidighetskontroller och hantering av eventuella samtidighetskonflikter implementeras på egen hand. [11] Uppstår det en samtidighetskonflikt i den lagrade proceduren kastas ett undantag som applikationen fångar. (se figur 1.3) Figur 1.3 Kodsats som fångar eventuella undantag kastade av den lagrade proceduren under samtidighetskontrollen 13

I samband med att undantaget fångas presenterar applikationen ett felmeddelande för användaren och informerar att objektet som man försökte modifiera har ändrats sedan sidan lästes in. (se figur 1.4) Figur 1.4 Felmeddelande som visas i applikationen då samtidighetskonflikt inträffar Figur 1.5 nedan visar flödet över de processer som på något sätt försöker uppdatera en av de tabellerna som innehåller tidsstämpling, till exempel vid ett köp av en artikel i önskelistan. Inträffar en samtidighetskonflikt går man tillbaka till första steget och informationen måste läsas in på nytt för att se vilka ändringar som har gjorts. 14

Figur 1.5 Flödesdiagram över samtidighetskontroll i databas och applikation och kommunikationen dem emellan 15

5. Slutsats Utökningen som utgjorde den praktiska grunden för undersökningen utvecklades med ASPdotnet Web Forms och ADO-dotnet utan Entity Framework. Detta resulterade i att det inte finns färdigt stöd för samtidighetskontroll. Istället var allt stöd för samtidighetskontroll och hantering av eventuella konflikter tvunget att skapas av oss själva. Tidigare forskning förordar att man sköter kontrollen i de lagrade procedurerna för att sedan kasta undantag vid eventuella konflikter och låta applikationen ta hand om dessa samt meddela användaren om vad som har inträffat. Nackdelen med detta är att dotnetramverket endast förstår att ett undantag har kastats, men inte specifikt vilket, förutom att det exempelvis kommer från databasen i form av ett undantag av typen SqlException 6 och vilken felkod som är specificerad tillsammans med ett meddelande. I den metod vi valde att använda så förstår ramverket till exempel inte om tidsstämpeln är felaktig och att data har modifierats eller om posten är borttagen. För en större bredd av felmeddelanden måste man i sådana fall kontrollera olika scenarion som kan inträffa i den lagrade proceduren. Dock är inte vinsten av detta så pass stor att det berättigar merarbetet i både utveckling och databasanrop. Denna problematik har behandlats i senare versioner av dotnetramverket som använder sig av ADO-dotnet Entity Framework där man kan specifikt markera fält för samtidighetskontroll som sedan applikation hanterar på rätt sätt och därav förstår att en samtidighetskonflikt har inträffat utan att man behöver jobba med avancerade och krävande lagrade procedurer. [11] Implementation av samtidighetskontroll i applikationer utvecklade med ASP-dotnet Web Forms och ADO-dotnet är okomplicerat och då det mesta av jobbet görs på databasnivå ges även intrycket av att det inte är mycket svårare att göra det inom andra programmeringsspråk och ramverk heller. Hur samtidighetskontrollen implementeras och utförs i de lagrade procedurerna skrivna med sql kräver endast en grundläggande kunskap för att förstå. Tar man i åtanke att samtidighetskonflikter ska fångas redan från början när man modellerar databasen och skapar sina lagrade procedurer är i stort sett det mesta gjort. I framtida arbete med applikationer där samtidighetskonflikter är ett orosmoment känns det för oss numera självklart att hantera dessa. 6 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.aspx 16

6. Fortsatt forskning För fortsatt forskning kan man jämföra hur samtidighetskonflikter hanteras i olika typer av databaser. Är det någon typ av databas som är mer anpassad för samtidighetskonflikt än de andra? På samma sätt kan andra programmeringsspråk och ramverk undersökas för att se om något av dem har lyft fram samtidighetskontroll på något särskilt sätt som underlättar implementationen. 17

7. Källförteckning [1] Microsoft, MSDN - timestamp (Transact-SQL), Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx. [Använd 17 04 2012]. [2] J. Hakeröd, Databaser och databasdesign, 28 11 2011. [Online]. Available: http://www.hh.se/download/18.1934d01e133dac835f38000359/f5_pul_sak_trans_2011.pdf. [Använd 17 04 2012]. [3] A. Larsson och T. Nygren, Transaktionshantering med samtidighetskontroll i databaser, University of Gävle, Department of Mathematics, Natural and Computer Science, Gävle, 2006. [4] A. Kuznetsov, Developing Modifications that Survive Concurrency, simple-talk, 22 06 2010. [Online]. Available: http://www.simple-talk.com/sql/t-sql-programming/developingmodifications-that-survive-concurrency/?utm_source=simpletalk&utm_medium=emailmain&utm_content=modifications-20100629&utm_campaign=sql. [Använd 17 04 2012]. [5] Microsoft, MSDN - Concurrency Effects, Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/ms190805(v=sql.90).aspx. [Använd 30 04 2012]. [6] Microsoft, MSDN - Types of Concurrency Control, Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/ms189132(v=sql.90).aspx. [Använd 17 04 2012]. [7] S. Dahl, Föreläsning 7 - GIS, databasteknik och kartografi (1E1601), 2004. [Online]. Available: http://www.nada.kth.se/kurser/kth/1e1601/03-04/pdffiler/f7-handouts.pdf. [Använd 17 04 2012]. [8] J. Chase, CPS212 - Transactional Concurrency Control, 10 11 2002. [Online]. Available: http://www.cs.duke.edu/~chase/cps212-archive/slides/actions6.pdf. [Använd 17 04 2012]. [9] M. MacDonald, A. Freeman och M. Szpuszta, Pro ASP.Net 4 in C# 2010, APRESS, 2010. [10] H. Kjellström, DD1368 Databasteknik Föreläsning 4: Indexering, transaktionshantering, 27 01 2011. [Online]. Available: http://www.csc.kth.se/utbildning/kth/kurser/dd1368/dbtd11/pdf/forelasning4_4.pdf. 18

[Använd 17 04 2012]. [11] Microsoft, MSDN - Saving Changes and Managing Concurrency, Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/bb738618.aspx. [Använd 09 05 2012]. 19