I don't see how a transaction saves you here(without locking the row), can you elaborate? In EF projects, this problem is solved through optimistic concurrency, similar to the fashion you described - a column that changes on each update is used as a canary to confirm that you're applying changes to the record you expect.
https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting...
This also has the added benefit of allowing you to issue only 1 query(just the update), instead of select + update.