\begin{frame}
\frametitle{Cascades / Recoverable}
\begin{goal}{Definition: Recoverable Schedule}
\emph{Delay commits:}
\begin{itemize}
\item If $T_2$ reads a value written by $T_1$, the commit of $T_2$ must be delayed until after the commit of $T_1$.
\end{itemize}
\end{goal}
\pause
\begin{alertblock}{}
\emph{Schedules should always be recoverable}!
\end{alertblock}
\pause\medskip
\begin{goal}{Definition: Cascadeless Schedule}
\emph{Delay reads:} only read values produced by already committed transactions.
\begin{itemize}
\item If $T_2$ reads a value written by $T_1$, then the read is delayed until
after the commit of $T_1$.
\end{itemize}
\end{goal}
\pause
\emph{No dirty reads}, thus abort (rollback) \emph{does not cascade}!
\pause
\begin{block}{}
All cascadeless schedules are recoverable.
\end{block}
\bigskip
\end{frame}