মনে করুন আপনার কিছু ব্যাংক অ্যাকাউন্ট রয়েছে:
(def accounts
[(ref 0)
(ref 10)
(ref 20)
(ref 30)])
এবং একটি পারমাণবিক "স্থানান্তর" ফাংশন:
(defn transfer [src-account dest-account amount]
(dosync
(alter dest-account + amount)
(alter src-account - amount)))
যা নিম্নলিখিত হিসাবে কাজ করে:
(transfer (accounts 1) (accounts 0) 5)
(map deref accounts)
=> (5 5 20 30)
তারপরে আপনি উচ্চতর স্তরের লেনদেন তৈরি করতে সহজেই স্থানান্তর ফাংশন রচনা করতে পারেন, উদাহরণস্বরূপ একাধিক অ্যাকাউন্ট থেকে স্থানান্তর:
(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)
দ্রষ্টব্য যে একাধিক স্থানান্তর সমস্ত একক, সম্মিলিত লেনদেনে হয়েছিল, অর্থাত্ ছোট লেনদেনগুলি "রচনা" করা সম্ভব হয়েছিল।
লক দিয়ে এটি করা খুব দ্রুত জটিল হয়ে উঠবে: অ্যাকাউন্টগুলি স্বতন্ত্রভাবে লক করা দরকার তা ধরে নিলে আপনার অচলাবস্থা এড়াতে লক অধিগ্রহণের আদেশে একটি প্রোটোকল স্থাপন করার মতো কিছু করা দরকার। হার্ড-টু-ডিটেক্ট ভুল করা খুব সহজ। এসটিএম আপনাকে এই সমস্ত ব্যথা থেকে বাঁচায়।