  Transactional memory is a mechanism that manages thread synchronisation on
behalf of a programmer so that blocks of code execute with an illusion of
atomicity. The main safety criterion for transactional memory is opacity, which
defines conditions for serialising concurrent transactions.
  Proving opacity is complicated because it allows concurrent transactions to
observe distinct memory states, while TM implementations are typically based on
one single shared store. This paper presents a sound and complete method, based
on coarse-grained abstraction, for reducing proofs of opacity to the relatively
simpler correctness condition: linearizability. We use our methods to verify
TML and NORec from the literature and show our techniques extend to relaxed
memory models by showing that both are opaque under TSO without requiring
additional fences. Our methods also elucidate TM designs at higher level of
abstraction; as an application, we develop a variation of NORec with fast-path
reads transactions. All our proofs have been mechanised, either in the Isabelle
theorem prover or the PAT model checker.
