Release Timing: Hold all exclusive (write) locks until commit/abort; shared (read) locks may be released earlier in the shrinking phase
Advantage: Prevents cascading aborts (no one can read uncommitted writes)
Trade-off: Lower concurrency, higher safety
Most Common: Used by most database systems
Rigorous 2PL (R2PL)
Release Timing: Hold all locks (shared and exclusive) until commit/abort
Strictest: Most restrictive variant
Difference from Strict: Strict 2PL holds only write locks to the end; Rigorous holds read locks too, so the commit order equals the serialization order
Advantage: Strongest isolation guarantees
Usage: High-consistency requirements
Problem: Double Booking Example
Scenario
System: Hotel reservation system
Resource: Single room for specific date
Conflict: Two customers trying to book same room simultaneously
Without 2PL
-- Transaction A (Customer 1)SELECT available_rooms FROM rooms WHERE date = '2024-01-15' AND room_id = 101;-- Returns: 1 room available-- Transaction B (Customer 2) - runs concurrentlySELECT available_rooms FROM rooms WHERE date = '2024-01-15' AND room_id = 101;-- Returns: 1 room available (same data)-- Both see room as available-- Transaction AINSERT INTO bookings (room_id, date, customer_id) VALUES (101, '2024-01-15', 'A');UPDATE rooms SET available_rooms = 0 WHERE room_id = 101 AND date = '2024-01-15';-- Transaction BINSERT INTO bookings (room_id, date, customer_id) VALUES (101, '2024-01-15', 'B');UPDATE rooms SET available_rooms = -1 WHERE room_id = 101 AND date = '2024-01-15';-- Result: Double booking!
With 2PL Solution
-- Transaction ABEGIN TRANSACTION;SELECT available_rooms FROM rooms WHERE date = '2024-01-15' AND room_id = 101 FOR UPDATE;-- Acquires exclusive lock on room record-- Transaction B (must wait)BEGIN TRANSACTION;SELECT available_rooms FROM rooms WHERE date = '2024-01-15' AND room_id = 101 FOR UPDATE;-- Blocked: waiting for Transaction A's lock-- Transaction A continuesIF available_rooms > 0 THEN INSERT INTO bookings (room_id, date, customer_id) VALUES (101, '2024-01-15', 'A'); UPDATE rooms SET available_rooms = available_rooms - 1 WHERE room_id = 101;END IF;COMMIT; -- Releases all locks-- Now Transaction B can proceed-- Will see updated available_rooms = 0-- Booking fails gracefully