\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}