Misalkan Anda memiliki beberapa rekening bank:
(def accounts
[(ref 0)
(ref 10)
(ref 20)
(ref 30)])
Dan fungsi "transfer" atom:
(defn transfer [src-account dest-account amount]
(dosync
(alter dest-account + amount)
(alter src-account - amount)))
Yang berfungsi sebagai berikut:
(transfer (accounts 1) (accounts 0) 5)
(map deref accounts)
=> (5 5 20 30)
Anda kemudian dapat dengan mudah menyusun fungsi transfer untuk membuat transaksi tingkat yang lebih tinggi, misalnya mentransfer dari beberapa akun:
(defn transfer-from-all [src-accounts dest-account amount]
(dosync
(doseq [src src-accounts]
(transfer src dest-account amount))))
(transfer-from-all
[(accounts 0) (accounts 1) (accounts 2)]
(accounts 3)
5)
(map deref accounts)
=> (0 0 15 45)
Perhatikan bahwa semua transfer berganda terjadi dalam satu transaksi tunggal, yaitu mungkin untuk "menyusun" transaksi yang lebih kecil.
Untuk melakukan ini dengan kunci akan menjadi rumit dengan sangat cepat: dengan asumsi akun perlu dikunci secara individual maka Anda perlu melakukan sesuatu seperti membuat protokol pada pesanan akuisisi kunci untuk menghindari kebuntuan. Sangat mudah untuk membuat kesalahan yang sulit dideteksi. STM menyelamatkan Anda dari semua rasa sakit ini.