Introduction
Serializability ignores failures: it assumes every transaction commits. A real system must also handle a transaction that aborts after other transactions have read what it wrote. Recoverability classifies schedules by how safely they survive such aborts, using the positions of commits and aborts. A schedule can be serializable and still unacceptable because an abort would force the system to undo a committed transaction.
The tasks are to decide whether a given schedule is recoverable, cascadeless or strict, and how these classes relate to each other and to conflict serializability.
Prerequisites
- Schedules, Conflict Serializability and View Serializability: schedules, conflicts and reads-from.
Core concepts
Reads from. reads from if reads the value written by the latest before it, and . A write by a transaction that has already aborted has been undone, so a later read does not read from it.
Recoverable. Whenever reads from , commits before commits. (If never commits, the condition places no constraint.) In a non-recoverable schedule, an abort of after has committed cannot be handled correctly: read a value that is being undone, but a committed transaction cannot be rolled back.
Cascading rollback. In a recoverable schedule an abort of may still force every transaction that read from to abort, then every transaction that read from those, and so on.
Cascadeless (avoids cascading aborts, ACA). A transaction reads an item only after any other transaction whose still-uncommitted value it would read has committed (or its aborted write has been undone). No dirty reads, so no cascading rollback.
Strict. No transaction reads or writes until the other transaction that last wrote has committed or aborted. Undo can then simply restore before-images.
Hierarchy:
Each inclusion is strict. Recoverability is independent of serializability: a schedule can be conflict serializable but not recoverable, or strict but not conflict serializable.

How it works: testing a schedule
for each read R_j(X) reading from W_i(X), i != j:
recoverable needs: if T_j commits, then C_i comes before C_j
cascadeless needs: C_i (or A_i) comes before R_j(X)
for each read or write by T_j of X after W_i(X), i != j, with no write of X in between:
strict needs: C_i (or A_i) comes before that operationCheck the strongest property first: a strict schedule is automatically cascadeless and recoverable.
Mathematical explanation
Why strict implies cascadeless. Cascadeless restricts reads of uncommitted data; strict restricts both reads and writes, so it forbids more.
Why cascadeless implies recoverable. If reads from only after , then precedes and therefore precedes .
Why strict matters for recovery. If overwrites an uncommitted and then aborts, restoring 's before-image would wipe out 's write. Strictness rules this out, so undo by before-images is always correct.
Which transactions a cascade reaches. Draw a reads-from graph with an edge when reads from and has not yet ended at the time of the read. When aborts, every transaction reachable from in this graph that has not committed must abort too. For , the edges are , and , so an abort of forces , and to abort, while , which read nothing, is unaffected. In a cascadeless schedule the graph has no edges, so an abort affects only the aborting transaction.
Link to locking. Strict two-phase locking holds exclusive locks until commit, which makes every schedule it allows strict (and conflict serializable); see Lock-Based Concurrency Control.
Worked examples
Example 1: not recoverable. . reads from and commits first. If aborted instead of committing, the committed would hold a value that never existed. is conflict serializable (edge only) but not recoverable.
Example 2: recoverable, not cascadeless. . commits before , so it is recoverable; is a dirty read, so it is not cascadeless.
Example 3: cascadeless, not strict. . Nobody reads uncommitted data, so it is cascadeless (and recoverable); overwrites an uncommitted write, so it is not strict.
Example 4: strict. . Item is touched by only after . Strict, hence cascadeless and recoverable, though not serial.
Example 5: cascading rollback. . read from , and read from . When aborts, must abort, and then must abort. The schedule is recoverable (nobody has committed) but not cascadeless.
Example 6: independence from serializability.
- : not conflict serializable (cycle ), yet cascadeless, because both reads see the initial value. It is not strict, because overwrites the uncommitted .
- : strict, since no item written by an uncommitted transaction is touched, but not conflict serializable ( before gives ; before gives ).
Example 7: placing commits. The operations are followed by the three commits in some order. reads from and reads from , so recoverability needs before and before : of the commit orders only gives a recoverable schedule. No commit order makes it cascadeless, because the dirty reads have already happened before any commit.
Example 8: a read from a transaction that aborts. . read a value written by , and aborted, yet commits: not recoverable. A recoverable system must abort when aborts, giving , which is recoverable.
Summary of the examples.
| Schedule | Recoverable | Cascadeless | Strict | Conflict serializable |
|---|---|---|---|---|
| no | no | no | yes | |
| yes | no | no | yes | |
| yes | yes | no | yes | |
| yes | yes | yes | yes | |
| yes | yes | no | no | |
| yes | yes | yes | no | |
| no | no | no | yes |
Making a schedule safer. A non-recoverable schedule becomes recoverable by delaying the reader's commit until the writer commits (Example 1 with moved before ). It becomes cascadeless only by delaying the read itself until the writer commits, which is what holding exclusive locks to commit achieves.
Related material. A schedule is rigorous if no transaction may perform any operation that conflicts with an operation of an uncommitted transaction, including overwriting an item that an uncommitted transaction has only read. Rigorous two-phase locking, which holds all locks to commit, produces such schedules; the commit order is then also a valid serialization order.
Important properties and observations
- Recoverable: writers commit before their readers commit.
- Cascadeless: read only committed data.
- Strict: neither read nor overwrite uncommitted data.
- Serial strict cascadeless recoverable.
- Recoverability and serializability are independent; a correct protocol needs both.
- Strict 2PL produces schedules that are both strict and conflict serializable.
Common misconceptions.
- "Cascadeless means no aborts." It means an abort never forces other aborts.
- "A conflict-serializable schedule is recoverable." Example 1 is serializable and not recoverable.
- "Recoverable only concerns reads of committed data." It concerns the order of commits; dirty reads are allowed.
GATE examination perspective
- Classify a schedule. As non-recoverable, recoverable, cascadeless or strict.
- Combine. Combine this with conflict serializability: four combinations are all possible.
- Cascading rollback. Which transactions must abort when one aborts.
- Protocol links. Strict 2PL gives strict schedules; basic 2PL may give cascading aborts.
Summary
Sources
- A. Silberschatz, H. F. Korth, S. Sudarshan, Database System Concepts, 7th ed., McGraw-Hill, 2019 (2020 copyright), 17.7 Transaction Isolation and Atomicity.
- R. Elmasri, S. B. Navathe, Fundamentals of Database Systems, 7th ed., Pearson, 20.4 Characterizing Schedules Based on Recoverability.