.  Assume that transaction A
    obtains a read lock on X and confirms that a modification is needed.
    Then it is descheduled and the thread containing transaction B runs.
    At that time, transaction B obtains a read lock on X and confirms that
    it also wants to make a modification.  Both transactions A and B will
    block when they attempt to upgrade their read locks to write locks
    because the other already holds a read lock.  This is a deadlock.
    Transaction A cannot make forward progress 