Start here. This is the direct spoken answer to practice first.
Why this question matters
Lost updates are easy to miss in normal CRUD demos. This drill connects SQL rowversion behavior to the API contract users actually experience.
For a SQL Server-backed API, I map a rowversion column as an EF Core concurrency token and encode it as an HTTP ETag. An update requires If-Match; the API decodes that value and supplies it as the original concurrency token. EF includes it in the update predicate, and SaveChangesAsync throws DbUpdateConcurrencyException when another write has changed the row. A missing precondition and a stale precondition get deliberate HTTP responses instead of silently becoming last-write-wins.