1. A method comprising: (a) copying a page of a first memory to a second memory and to a cache prior to a first transaction that is executed by a first process; (b) when said page is updated by said first transaction: (i) suspending said first process, (ii) copying, via a second process, the updated contents of said page to said cache, without overwriting in said cache the contents of said page prior to said first transaction, (iii) resuming execution of said first process after the copying of the updated contents of said page to said cache, (iv) updating the contents of said page in said second memory to match the updated contents of said page in said first memory, and (v) updating a pointer to said cache so that it points to the contents of said page after said first transaction instead of the contents of said page prior to said first transaction; (c) when said page is updated again by a second transaction that is executed by a process Q after said first transaction, wherein said process Q is one of said first process and a third process: (i) suspending said process Q, (ii) copying, via said second process, the updated contents of said page to said cache, without overwriting the prior contents of said page pointed to by said pointer, (iii) resuming execution of said process P after the copying of the updated contents of said page to said cache, (iv) updating the contents of said page in said second memory to match the updated contents of said page in said first memory, and (v) updating said pointer so that it points to the newly-updated contents of said page after said second transaction.