Simulation of Transactional Memory
If we successfully completed, commit the changes and cleanup.
If there is a conflict, the transaction is aborted.  Restore the modified locations to their original values, wait some time, and then try again
Transformation load/store operations in original code.  As long as there are no conflicts, the transaction executes as usual.
For a transaction, keep track of the memory locations accessed.