Deterministic Multithreading Using Preordered Transactions