Ví dụ về khả năng kết hợp của bộ nhớ giao dịch phần mềm


11

Một trong những lợi thế chính của bộ nhớ giao dịch phần mềm luôn được nhắc đến là khả năng kết hợp và mô đun hóa. Các mảnh khác nhau có thể được kết hợp để tạo ra các thành phần lớn hơn. Trong các chương trình dựa trên khóa, điều này thường không phải là trường hợp.

Tôi đang tìm kiếm một ví dụ đơn giản minh họa điều này với mã thực tế. Tôi thích một ví dụ trong Clojure, nhưng Haskell cũng ổn. Điểm thưởng nếu ví dụ cũng thể hiện một số mã dựa trên khóa không thể được soạn thảo dễ dàng.


1
Thú vị, nhưng nghe có vẻ giống như một câu hỏi StackOverflow với tôi.
Steve

Câu hỏi này đã được hỏi ở đó 4 phút sau. stackoverflow.com/questions/5518546/ Từ Có ai đó sẽ di chuyển và hợp nhất câu hỏi này (nếu có thể)?
Công việc

Vâng sau khi tôi đăng nó ở đây, tôi nhận ra rằng nó có thể sẽ tốt hơn trên Stackoverflow. Nếu ai đó có thể hợp nhất nó, điều đó tốt với tôi.
dbyrne

Câu trả lời:


9

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.