Tilsynelatende riktige programmer kan gå feil fordi en database normalt har mange samtidige brukere. Hvorfor kan illustreres ved to banktjenester som utføres omtrent samtidig. Kunde A skal ta ut 1000 kroner fra konto X. Kunde B skal overføre 2500 kr fra konto Y til konto X. Programmene kan se slik ut:
\(\begin{array}{rr}\begin{array}{|lll|}\hline &\texttt{Kunde A} & \\ \hline\texttt{tid}&\texttt{operasjon}&\texttt{kommentar} \\ \hline 1 & \texttt{s=les(X)} & \texttt{les X }\\2 & \texttt{s=s+1000} & \texttt{sett inn 1000}\\ 3 & \texttt{skriv(X,s)}& \texttt{oppdater X }\\ \hline\end{array} &\begin{array}{|lll|} \hline &\texttt{Kunde B} & \\ \hline\texttt{tid}&\texttt{operasjon}&\texttt{kommentar} \\ \hline1 & \texttt{r=les(Y)} & \texttt{les Y}\\2 & \texttt{r=r-2500} & \texttt{ta ut 2500}\\ 3 & \texttt{skriv(Y,r)}& \texttt{oppdater Y} \\ 4 & \texttt{r=les(X)} & \texttt{les X}\\5 & \texttt{r=r+2500} & \texttt{sett inn 2500}\\ 6 & \texttt{skriv(X,r)}& \texttt{oppdater X} \\ \hline \end{array} \end{array}\)
Når programmene skal utføres i praksis blir operasjonene fra forskjellige programmer flettet sammen for å oppnå god total ytelse og for at store programmer ikke skal stenge små programmer ute over lang tid. Seksvensen av operasjonene innenfor samme program endres ikke. En aktuell utførelse kan se slik ut:
\( \begin{array}{rr}\begin{array}{|lll|}\hline &\texttt{Kunde A} & \\ \hline\texttt{tid}&\texttt{operasjon}&\texttt{kommentar} \\ \hline 1 & & \\2 & & \\3 & & \\4 & & \\5 & \texttt{s=les(X)} & \texttt{les X (5000)}\\6 & \texttt{s=s+1000} & \texttt{sett inn 1000}\\ 7 & \texttt{skriv(X,s)}& \texttt{oppdater X(6000)}\\8 & & \\9 & & \\ \hline\end{array} &\begin{array}{|lll|} \hline &\texttt{Kunde B} & \\ \hline\texttt{tid}&\texttt{operasjon}&\texttt{kommentar} \\ \hline1 & \texttt{r=les(Y)} & \texttt{les Y}\\2 & \texttt{r=r-2500} & \texttt{ta ut 2500}\\ 3 & \texttt{skriv(Y,r)}& \texttt{oppdater Y} \\ 4 & \texttt{r=les(X)} & \texttt{les X (5000)}\\5 & & \\6 & & \\7 & & \\8 & \texttt{r=r+2500} & \texttt{sett inn 2500}\\ 9 & \texttt{skriv(X,r)}& \texttt{oppdater X (7500)} \\ \hline \end{array} \end{array}\)
Resultatet er ikke riktig. 1000 kroner som ble satt inn av kunde A er ikke kommet inn i databasen. Etter at begge programmer er utført burde konto X hatt 8500 kroner.
Vi ser også at hvis kunde B sitt program hadde blitt avbrudt etter linje 4, ville 2500 kroner ha forsvunnet fra banken.
Slike forhold er årsaken til at en grupperer databaseoperasjoner i transaksjoner. En transaksjon blir enten gjennomført eller annulert - alt eller intet. I eksemplet vil kunde B sin transaksjon bli annullert ved operasjonen i linje 9. Programmet vil da oppdage at det prøver å skrive over en post som er endret siden den ble lest.
For å kunne annullere en transaksjon må utførelsen være gjenopprettbar, det vil si at alle endringer som er gjort av den annullerte transaksjon må kunne oppheves. Det er utviklet metoder som sikrer at transaksjoner blir korrekt utført. Det innebærer i praksis at databaseprogrammet har en strategi for hvordan operasjonene i forskjellige transaksjoner kan "flettes" sammen uten at det blir feil i databasen.
Kommentarer
Kommentaren din publiseres her. Fagansvarlig eller redaktør svarer når de kan.
Du må være logget inn for å kommentere.