Human errors can cause failures, and this cannot be prevented by a perfect system. Use many many unreliable parts to provide redundancy on a grand scale. For example, each process in NonStop has a backup process which can continue to work in case the first one died. Object addresses become , so that it is possible to retrieve the state of an object at any time in the past. Writing the header of the object implicitly lock the object from others.
Every read becomes a write because needs to update the time stamp.
Waits are aborts. Timestamps forces a single granularity. Cannot have shared read access. The log should be kept in stable storage to avoid losing log entries in case of a system crash. To accomplish this, use exclusive write locks and shared read locks.