Software Transactional Memory (Java)

Software Transactional Memory (Java)

Overview of STM

An STM turns the Java heap into a transactional data set with begin/commit/rollback semantics. Very much like a regular database. It implements the first three letters in ACID; ACI:

  • Atomic
  • Consistent
  • Isolated

Generally, the STM is not needed very often when working with Akka. Some use-cases (that we can think of) are:

  • When you really need composable message flows across many actors updating their internal local state but need them to do that atomically in one big transaction. Might not be often, but when you do need this then you are screwed without it.
  • When you want to share a datastructure across actors.

The use of STM in Akka is inspired by the concepts and views in Clojure's STM. Please take the time to read this excellent document about state in clojure and view this presentation by Rich Hickey (the genius behind Clojure).

Scala STM

The STM supported in Akka is ScalaSTM which will be soon included in the Scala standard library.

The STM is based on Transactional References (referred to as Refs). Refs are memory cells, holding an (arbitrary) immutable value, that implement CAS (Compare-And-Swap) semantics and are managed and enforced by the STM for coordinated changes across many Refs.

Integration with Actors

In Akka we've also integrated Actors and STM in Agents (Java) and Transactors (Java).