Giả sử bạn có một số tài khoản ngân hàng:
(def accounts
[(ref 0)
(ref 10)
(ref 20)
(ref 30)])
Và một chức năng "chuyển giao" nguyên tử:
(defn transfer [src-account dest-account amount]
(dosync
(alter dest-account + amount)
(alter src-account - amount)))
Hoạt động như sau:
(transfer (accounts 1) (accounts 0) 5)
(map deref accounts)
=> (5 5 20 30)
Sau đó, bạn có thể dễ dàng soạn chức năng chuyển để tạo giao dịch cấp cao hơn, ví dụ: chuyển từ nhiều tài khoản:
(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)
Lưu ý rằng tất cả các lần chuyển tiền đã xảy ra trong một giao dịch kết hợp, tức là có thể "soạn" các giao dịch nhỏ hơn.
Để thực hiện việc này với các khóa sẽ trở nên phức tạp rất nhanh: giả sử các tài khoản cần được khóa riêng lẻ thì bạn cần phải làm một cái gì đó như thiết lập một giao thức theo thứ tự mua lại khóa để tránh bế tắc. Rất dễ mắc lỗi khó phát hiện. STM cứu bạn khỏi tất cả nỗi đau này.