The agent added a row lock — but it locked after reading the balance
Two concurrent withdrawal requests both read $100, both passed the check, both wrote $0. The agent had added FOR UPDATE to stop double-spend. It just put the lock on the wrong side of the read.