124/212
\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}