\documentclass{bschlangaul-aufgabe}
\bLadePakete{spalten}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe „Tabelle TAB“},
  Thematik = {Tabelle TAB},
  Referenz = DB.Transaktionsverwaltung.Tabelle-TAB,
  RelativerPfad = Module/10_DB/60_Transaktionsverwaltung/Aufgabe_Tabelle-TAB.tex,
  ZitatSchluessel = db:ab:6,
  ZitatBeschreibung = {Aufgabe 3},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Transaktionsverwaltung, Lost-Update, Dirty-Read},
}

Die Transaktionen eines Transaktionsprogramms besteht aus SQL-Befehlen.
Die Transaktionen $T_1$ und $T_2$ arbeiten auf der Tabelle TAB.
\index{Transaktionsverwaltung}
\footcite[Aufgabe 3]{db:ab:6}

\begin{center}
\begin{tabular}{|l|}
\hline
Transaktion $T_1$     \\\hline\hline
BOT                   \\\hline
SELECT FROM TAB       \\\hline
NEUF := F+5           \\\hline
UPDATE TAB SET F=NEUF \\\hline
COMMIT WORK           \\\hline
\end{tabular}
%
\begin{tabular}{|l|}
\hline
Transaktion $T_2$     \\\hline\hline
BOT                   \\\hline
SELECT FROM TAB       \\\hline
NEUF := F*2           \\\hline
UPDATE TAB SET F=NEUF \\\hline
COMMIT WORK           \\\hline
\end{tabular}
%
\begin{tabular}{|l|}
\hline
TAB \\\hline\hline
F \\\hline
2 \\\hline
\end{tabular}
\end{center}

\noindent
Die quasiparallele Abarbeitung erfolgt in folgenden Schritten:

\begin{center}
\begin{tabular}{|r|l|l|}
\hline
   & $T_1$                 & $T_2$                 \\\hline\hline
1  &                       & BOT                   \\\hline
2  & BOT                   &                       \\\hline
3  & SELCT F FROM TAB      &                       \\\hline
4  &                       & SELECT F FROM TAB     \\\hline
5  &                       & NEUF := F*2           \\\hline
6  & NEUF := F+5           &                       \\\hline
7  & UPDATE TAB SET F=NEUF &                       \\\hline
8  & COMMIT WORK           &                       \\\hline
9  &                       & UPDATE TAB SET F=NEUF \\\hline
10 &                       & COMMIT WORK           \\\hline
\end{tabular}
\end{center}

\begin{enumerate}

%%
%
%%

\item Ist die (quasiparallele) Bearbeitung der Transaktionen korrekt?
Begründung!\index{Lost-Update}

\begin{bAntwort}
Nein, es liegt ein Lost-Update-Fehlerfall vor. In Schritt 3 bzw. 4 lesen
$T_1$ bzw. $T_2$ denselben Wert aus der Tabelle TAB. Der von $T_1$ in
Schritt 7 in die Tabelle zurückgeschriebene Wert wird in Schritt 9 von
$T_2$ überschrieben.
\end{bAntwort}

%%
%
%%

\item Konstruieren Sie unter Verwendung von $T_1$ und $T_2$ einen
Dirty-Read-Fehlerfall.
\index{Dirty-Read}

\begin{bAntwort}

\begin{center}
\begin{tabular}{|r|l|l|}
\hline
   & $T_1$                 & $T_2$                 \\\hline\hline
1  &                       & BOT                   \\\hline
2  & BOT                   &                       \\\hline
3  & SELCT F FROM TAB      &                       \\\hline
4  & NEUF := F+5           &                       \\\hline
5  & UPDATE TAB SET F=NEUF &                       \\\hline
6  &                       & SELECT F FROM TAB     \\\hline
7  &                       & NEUF := F*2           \\\hline
8  & ABORT                 &                       \\\hline
9  &                       & UPDATE TAB SET F=NEUF \\\hline
10 &                       & COMMIT WORK           \\\hline
\end{tabular}
\end{center}

Dirty-Read bedeutet, dass von zwei gleichzeitig ablaufenden
Transaktionen die eine Transaktion Daten liest, die von der anderen
Transaktion geschrieben bzw. geändert werden, jedoch noch nicht
bestätigt (committed) sind. Somit ist noch nicht sichergestellt, dass
diese Daten permanent in die Datenbank übernommen werden. Findet dann
ein Abort statt, hat die eine Transaktion Daten ausgelesen, die am Ende
nicht in der Datenbank ankommen.

Sobald $T_1$ committed hat, kann es dazu nicht mehr kommen, da dann die
Änderungen von $T_1$ permanent in der Datenbank festgeschrieben sind und
$T_2$ auf sichere, garantierte Werte zugreift.
\end{bAntwort}
\end{enumerate}
\end{document}
