Time is the thing that we don't have enough of at request time because a round trip takes years in computer time. (See "latency numbers every programmer should know")
It seems contention is the critical factor: if I have a database key and I want to scale concurrent access to it, we are contended on that key to see if other users are writing conflicting changes to the same key, such as MVCC.
Optimistic - assume no contention (and handle it when it happens)
Pessimistic - assume lots of contention (prepare to handle it before it happens)