The problem here is read-modify-write cycle
which cause Lost Updates
For Preventing Lost Updates
what we need here is Atomic write operations (atomic decrement function) or Compare-and-set (compare that the value read earlier is still the same).
We can use other mechanism like you have mentioned
(that will handle write skews and phantoms also)
Serializable Snapshot Isolation (SSI) -- which is optimistic concurrency control, and Two-phase locking which is Serializable isolation level
is Row versisoning same as multiversion concurrency control (MVCC)?