• Prove that the basic two-phase locking protocol guarantees conflict serializability of schedules. (Hint: Show that if a serializability graph for a schedule has a cycle, then at least one of the transactions participating in the schedule does not obey the two-phase locking protocol.)
  • Modify the data structures for multiple-mode locks and the algorithms for read_lock(X), write_lock(X), and unlock(X) so that upgrading and downgrading of locks are possible. (Hint: The lock needs to check the transaction id(s) that hold the lock, if any.
  • Prove that strict two-phase locking guarantees strict schedules.
  • Prove that the wait-die and wound-wait protocols avoid deadlock and starvation.