Lock caching. In the interest of simplicity, the transaction manager of section 8.5.4 has some minor inefficiencies. For example, get lock and save state messages are sent on each use of a cell by a transaction. It is clear that they are only really needed the first time. For this exercise, optimize the get lock and save state protocols so they use the least possible number of messages.