Probably because it’s more work, and it’s logic that you have to write and get correct. Whereas “for update” pretty much just works.
But there are definitely many valid solutions, including just setting the specific transaction to serializable and handling transaction retries.