An incompatible lock request waits and adds a wait-for edge.

highlighted = computed this step

A conflicting request waits

When a request is incompatible with a current holder, the requester waits. The wait-for graph points from the waiter to the holder. Note: the graph is recomputed from the final waiting state.

wait-for edge\text{wait-for edge}

Holder and waiter

The lock table has 1 waiter and the graph has 1 edge. Note: both facts are rendered from the same compiled schedule.

waiters=1,edges=1\text{waiters}=1,\quad \text{edges}=1

2PL and MVCC are exact protocol traces on tiny schedules; real lock managers, deadlock avoidance/timeouts, version garbage-collection, and isolation-level tuning are beyond these traces - no product claims.

Conflicting request waitsitemmodeholderswaitersAST1T2:X deadlock: noT1T2

Summary

Waiting is not itself a deadlock; it becomes a deadlock only when waits cycle. Note: 2PL and MVCC are exact protocol traces here; real lock managers, timeouts, garbage collection, and isolation tuning are beyond these traces.

waits first\text{waits first}