G27
Self-checkedTier 1 6 min readdbms.recoverability

Recoverable, cascadeless and strict schedules

Why serializability is not enough once transactions can abort: reads-from, recoverable schedules (a transaction commits only after every transaction it read from), cascadeless schedules (reads only committed values), strict schedules (no read or write of an uncommitted write, which also makes before-image undo correct) and rigorous schedules, the inclusions between the classes, cascading rollback, and the independence of the recoverability classes from conflict serializability; classes are computed by definition and recomputed by a dynamic simulation.

Why it exists

Serializability assumes every transaction commits. In real systems a transaction can abort (an error, a deadlock victim, a failed constraint). If another transaction has already used its values, that transaction depends on something that never happened. A schedule must therefore be arranged so that aborting one transaction can be done without undoing committed work. This page defines the classes of schedules that allow this, from weak to strong.

Prerequisites

You need schedules, conflicts and serializability (schedules and serializability).

Precise definitions

TjT_j reads from TiT_i (with i≠ji \ne j) if TjT_j reads an item XX whose latest preceding write was made by TiT_i (and TiT_i has not aborted before the read: its write would have been undone).

  • A schedule is recoverable if whenever TjT_j reads from TiT_i and TjT_j commits, then TiT_i commits before TjT_j commits. (If TiT_i later aborted, TjT_j would have committed a result built on a value that vanished, and a commit cannot be undone.)
  • A schedule avoids cascading aborts (is cascadeless, ACA) if every transaction reads only values written by committed transactions: cic_i comes before rj(X)r_j(X) whenever TjT_j reads XX from TiT_i. Then no abort ever forces another transaction to abort.
  • A schedule is strict if no transaction reads or overwrites an item written by another transaction until that transaction has committed or aborted.
  • A schedule is rigorous if it is strict and also no transaction writes an item that an uncommitted transaction has read: in no conflict does the later operation come before the other transaction has finished.

The inclusions: rigorous⊂strict⊂cascadeless⊂recoverable⊂all schedules\text{rigorous} \subset \text{strict} \subset \text{cascadeless} \subset \text{recoverable} \subset \text{all schedules}. Each class forbids more than the one before; the inclusions are proper (the examples below separate them).

Independence from serializability. A schedule can be conflict serializable and not recoverable, or recoverable and not conflict serializable. Rigorous schedules are conflict serializable (every conflicting pair is separated by the end of the first transaction, so the schedule is equivalent to the order of commits).

How it works

The classes on examples

Classes of schedules: start

Computed by a script, not typed
scheduleconflict serializablerecoverableavoids cascading abortsstrictrigorous
w1(A) r2(A) c2 c1
w1(A) r2(A) c1 c2
w1(A) w2(A) c1 c2
r1(A) w2(A) c2 c1
w1(A) c1 r2(A) w2(A) c2
r1(A) w2(A) w1(A) w3(A) c1 c2 c3

Step 0

Each answer is computed from the definitions in scripts/db_txn.py and recomputed by a dynamic simulation (dirty reads and dirty writes tracked as the schedule runs) in scripts/enum-checks/db_txn_check.py.

0 / 6
computed by script: schedules are executed on real values, conflicts and classes follow the definitions, locks are granted by a real lock manager. python3 scripts/gen-db5-traces.py

Reading the rows (each ends with the commits shown):

  • w1(A) r2(A) c2 c1w_1(A)\ r_2(A)\ c_2\ c_1: T2T_2 read from T1T_1 and committed first. Not recoverable: if T1T_1 aborted after c2c_2, the committed T2T_2 would have used a vanished value.
  • w1(A) r2(A) c1 c2w_1(A)\ r_2(A)\ c_1\ c_2: recoverable (the commit order is right), but T2T_2 read uncommitted data, so an abort of T1T_1 before c1c_1 would force T2T_2 to abort too: not cascadeless.
  • w1(A) w2(A) c1 c2w_1(A)\ w_2(A)\ c_1\ c_2: nobody reads uncommitted data, so cascadeless, but T2T_2 overwrote an uncommitted write: not strict.
  • r1(A) w2(A) c2 c1r_1(A)\ w_2(A)\ c_2\ c_1: strict (nothing written by an uncommitted transaction is touched; T2T_2 overwrites an item that T1T_1 only read), but not rigorous.
  • The serial schedule is rigorous.
  • The last row (the view serializable schedule of the previous page) is recoverable and cascadeless but neither strict nor conflict serializable: the two properties are independent.

Cascading rollback

Cascading rollback: start

Computed by a script, not typed
time12345
T1
T2
T3

Step 0

Nobody has committed yet: T2 builds on T1, T3 builds on T2.

0 / 5
computed by script: schedules are executed on real values, conflicts and classes follow the definitions, locks are granted by a real lock manager. python3 scripts/gen-db5-traces.py

T2T_2 read an uncommitted value of T1T_1, T3T_3 read an uncommitted value of T2T_2. When T1T_1 aborts, both T2T_2 and T3T_3 have used values that never existed and must abort: a cascading rollback (the abort spreads along the reads-from relation, transitively). Cascadeless schedules make this impossible, at the price of making readers wait for commits.

Why strictness matters for undo

Why dirty writes break undo: start

Computed by a script, not typed
time1234
T1
T2
database

Step 0

A = 100. T1 will abort; T2 will commit.

0 / 4
computed by script: schedules are executed on real values, conflicts and classes follow the definitions, locks are granted by a real lock manager. python3 scripts/gen-db5-traces.py

If T2T_2 overwrites an uncommitted write of T1T_1 and T1T_1 then aborts, restoring T1T_1's before-image (100100) destroys the value 130130 that T2T_2 wrote and committed. In a strict schedule no transaction touches an item written by an active transaction, so undoing a transaction simply restores the before-images of its own writes. That is why practical systems produce strict (usually rigorous) schedules.

Worked examples

EX 1Recoverable?

Easy

w1(X) r2(X) c2 c1w_1(X)\ r_2(X)\ c_2\ c_1: T2T_2 reads from T1T_1 and commits first: not recoverable. Swapping the commits to c1 c2c_1\ c_2 makes it recoverable (not cascadeless, because the read comes before c1c_1).

EX 2Strongest class

Medium

r1(A) w2(A) c2 c1r_1(A)\ w_2(A)\ c_2\ c_1: no transaction reads from another, so it is recoverable and cascadeless; no write touches an item written by an active transaction, so it is strict; T2T_2 writes AA which the active T1T_1 read, so it is not rigorous. Strongest class: strict.

EX 3Cascading abort set

Medium

w1(A) r2(A) w2(B) r3(B) a1w_1(A)\ r_2(A)\ w_2(B)\ r_3(B)\ a_1: T2T_2 read from T1T_1, T3T_3 read from T2T_2. If T1T_1 aborts, T2T_2 and T3T_3 must abort too: two further transactions are rolled back.

EX 4Typical questions

GATE level

(a) "Is a serializable schedule always recoverable?" No (w1(A) r2(A) c2 c1w_1(A)\ r_2(A)\ c_2\ c_1 is conflict serializable and not recoverable). (b) "Is every cascadeless schedule recoverable?" Yes. (c) "Is every strict schedule serializable?" No: strictness says nothing about conflict cycles. (d) "Which condition guarantees that no cascading rollback occurs?" Reading only committed data (cascadeless schedules).

Cheat box

Cheat box

  • Recoverable: a reader commits after the writer it read from.
  • Cascadeless: read only committed values. Strict: no read or write of an uncommitted write. Rigorous: also no write of an item read by an active transaction.
  • rigorous ⊂\subset strict ⊂\subset cascadeless ⊂\subset recoverable.
  • Independent of serializability: both directions fail.
  • Cascading rollback follows reads-from transitively.

Traps and GATE patterns

Connections

Locking protocols produce these classes: strict two-phase locking gives strict schedules, rigorous two-phase locking rigorous ones (two-phase locking). Undo and redo with a log are the subject of log-based recovery.

PYQs

6 previous year questions from your book. I re-solved each one myself (5 by running or simulating, 1 by reasoning only); the book's key is shown next to my answer. All PYQs

GATE 2025 · Set 1 · MCQQ4 · page 433 of the book
A schedule of three database transactions T1,T2, andT3 is
shown. Ri(A) and Wi (A) denote read and write of data
item A by transaction Ti, i=1,2,3 The transaction T1 aborts
at the end. Which other transaction(s) will be required to
be rolled back?
R1(X); W1(Y); R2(X); R2(Y); R3(Y) ;ABORT(T1);
  • (a)Only T2
  • (b)Only T3
  • (c)Both T2 and T3
  • (d)Neither T2 nor T3
year not read yetQ10 · page 434 of the book
Let S be the following schedule of operations of three
transactions T1, T2 and T3 in a relational database system:

R2(Y), R1(X), R3(Z), R1(Y), W1(X), R2(Z), W2(Y),
R3(X), W3(Z)

Consider the statements P and Q below:

P: S is conflict-serializable.

Q: If T3 commits before T1 finishes, then S is recoverable.

Which one of the following choices is correct?
  • (a)Both P and Q are true.
  • (b)P is false and Q is true.
  • (c)Both P and Q are false.
  • (d)P is true and Q is false.
GATE 2019 · MCQ · 1 markQ12 · page 434 of the book
Consider the following two statements about database
transaction schedules:

I. Strict two-phase locking protocol generates conflict
serializable schedules that are also recoverable.

II. Timestamp-ordering concurrency control protocol with
Thomas write rule can generate view serializable schedules
that are not conflict serializable.

Which of the above statements is/are TRUE?
  • (a)Both I and II
  • (b)Neither I nor II
  • (c)II only
  • (d)I only DATABASE MANAGEMENT SYSTEM
GATE 2016 · Set 2 · MCQ · 2 marksQ19 · page 436 of the book
Consider the following database schedule with two
transactions, T1 and T2.

S – r2(X); r1(X); r2(Y); w1(X); r1(Y); w2(X); a1; a2

Where ri(Z) denotes a read operation by transaction Ti
on a variable Z, wi(Z) denotes a write operation by Ti on
a variable Z and ai denotes an abort by transaction Ti.

Which one of the following statements about the above
schedule is TRUE?
  • (a)S is non-recoverable
  • (b)S is recoverable, but has a cascading abort
  • (c)S does not have a cascading abort
  • (d)S is strict
year not read yetQ21 · page 436 of the book
Consider the partial Schedule S involving two transactions
T1 and T2. Only the read and the write operations have
been shown. The read operation on data item P is denoted
by read(P) and write operation on data item P is denoted by
write(P).

Schedule S

Time Instance
Transaction ID

T1
T2
1
read(A)

2
write (A)

3

read(C)
4

write (C)
5

read(B)
6

write (B)
7

read(A)
8

commit
9
read(B)

Suppose that the transaction T1 fails immediately after
time instance 9. Which of the following statements is
correct?
  • (a)T2 must be aborted and then both T1 and T2 must be re-started to ensure transaction atomicity
  • (b)Schedule S is non-recoverable and cannot ensure transaction atomicity
  • (c)Only T2 must be aborted and then re- started to ensure transaction atomicity
  • (d)Schedule S is recoverable and can ensure atomicity and nothing else needs to be done.
GATE 2014 · Set 2 · MCQQ26 · page 437 of the book
Consider the following schedule S of transactions T1, T2,
T3, T4:

T1
T3
T3
T.
Writes
(X)
Commit

Writes
(Y)
Reads (Z)
Commit

Reads
(X)
Reads
(Y)
Commit

Which one of the following statements is CORRECT?
  • (a)S is conflict-serializable but not recoverable
  • (b)S is not conflict-serializable but is recoverable
  • (c)S is both conflict-serializable and recoverable
  • (d)S is neither conflict-serializable nor is it recoverable

Self-check

Question 1

w1(A) r2(A) c1 c2w_1(A)\ r_2(A)\ c_1\ c_2: the strongest class?

Show answer

Recoverable but not cascadeless (T2T_2 read before c1c_1).

Question 2

Is a rigorous schedule always conflict serializable?

Show answer

Yes: every pair of conflicting operations is separated by the end of the earlier transaction, so the schedule is equivalent to the serial schedule in commit order.

Question 3

Name a schedule that is cascadeless but not strict.

Show answer

w1(A) w2(A) c1 c2w_1(A)\ w_2(A)\ c_1\ c_2.

Revision card

One-screen revision

  • Recoverable: commit after the writers you read from.
  • Cascadeless: read committed data only. Strict: also no overwrite of uncommitted data. Rigorous: also no overwrite of data read by active transactions.
  • rigorous ⊂\subset strict ⊂\subset cascadeless ⊂\subset recoverable.
  • Independent of conflict serializability.

References

  • ·Silberschatz, Korth, Sudarshan, Database System Concepts (7th edition), Chapter 17, Section 17.6 (Transaction isolation and atomicity)
  • ·Elmasri, Navathe, Fundamentals of Database Systems (7th edition), Chapter 20, Section 20.4 (Characterizing schedules based on recoverability)

Verification

scripts/enum-checks/db_txn_check.py: on 6000 random schedules (2 or 3 transactions, items A and B, every transaction ends with a commit at a random position) the four class tests of scripts/db_txn.py agree with a dynamic simulation written separately (it tracks the last writer of every item and whether that writer is still active, the transactions each transaction has read from, and at each commit checks that all of them committed); the chain rigorous implies strict implies cascadeless implies recoverable held for every schedule, every class has examples, and rigorous schedules are conflict serializable. A second experiment aborted one of two transactions on one item with before-image undo: in no strict schedule did the undo destroy a surviving write. CONVENTIONS: (1) 'strict' here forbids reading AND writing an item last written by a transaction that is still active (the Silberschatz/Elmasri meaning); (2) 'rigorous' additionally forbids writing an item read by an active transaction, so no transaction ever depends on an uncommitted one in any conflict (rigorous schedules are the output of rigorous two-phase locking); (3) the page treats aborts only through the rules above and cascading_aborts, and assumes an aborted transaction's writes are undone; several books also define the classes for schedules in which some transactions abort - the definitions coincide. Recoverability and conflict serializability are independent (shown by the examples). Textbook section numbers are from memory. SECOND PASS (2026-11-02, done by the assistant, not a human check): every Self-check question was solved before the printed answer was read and all agreed; the definitions, worked examples, cheat box and traps were read claim by claim and re-derived against the textbook definitions and the sample database. No defect found. Status raised to self-checked; verified needs a textbook or human check.

last verified: never