Types of Schedules
Serial Schedules
Transactions run one after another (no mixing) Example: T₁ completely, then T₂ completely
T₁: Transfer ₹50 from A to B
T₂: Transfer 10% of A to B
Schedule 1 (T₁ → T₂):
-
Initial: A = 1000, B = 2000
-
After T₁: A = 950, B = 2050
-
After T₂: A = 855, B = 2145
-
Total preserved: 855 + 2145 = 3000 ✓
Concurrent Schedules
Operations from different transactions are mixed
Good Concurrent Schedule (equivalent to serial):
T₁: read(A)
T₁: A := A - 50
T₁: write(A)
T₂: read(A) ← reads value after T₁ updated A
T₂: temp := A * 0.1
T₂: A := A - temp
T₂: write(A)
T₁: read(B)
T₁: B := B + 50
T₁: write(B)
T₂: read(B)
T₂: B := B + temp
T₂: write(B)
Result: Same as Schedule 1 above ✓
Bad Concurrent Schedule:
T₁: read(A) A = 1000
T₁: A := A - 50 A = 950 in memory
T₂: read(A) A = 1000 (reads old value!)
T₂: temp := A * 0.1 temp = 100
T₁: write(A) A = 950 on disk
T₂: A := A - temp A = 900 in T₂'s memory
T₂: write(A) A = 900 on disk (overwrites T₁!)
...
Result: Money created out of nowhere! ✗