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
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
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.
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.