Two requests read the same row, both decide it is safe, both write. Row locks make the second one wait. Version checks make the second one fail and retry. Which one you pick depends on how often people collide and how long you hold the lock.
This deep-dive architectural analysis is part of the System Design & 75 Labs pass.