Jedną z głównych zalet programowej pamięci transakcyjnej, o której zawsze się wspomina, jest kompozycyjność i modułowość. Różne fragmenty można łączyć w celu wytworzenia większych elementów. W programach opartych na blokadach często tak nie jest.
Szukam prostego przykładu ilustrującego to faktycznym kodem. Wolałbym przykład w Clojure, ale Haskell też jest w porządku. Punkty bonusowe, jeśli przykład pokazuje również kod oparty na blokadzie, którego nie można łatwo skomponować.
Odpowiedzi:
Załóżmy, że masz kilka kont bankowych:
I atomowa funkcja „transferu”:
Który działa w następujący sposób:
Następnie możesz łatwo skomponować funkcję transferu, aby utworzyć transakcję wyższego poziomu, na przykład przesyłanie z wielu kont:
Pamiętaj, że wszystkie wielokrotne przelewy miały miejsce w jednej, połączonej transakcji, tzn. Możliwe było „skomponowanie” mniejszych transakcji.
Aby to zrobić z blokadami, bardzo szybko się skomplikuje: zakładając, że konta muszą być indywidualnie blokowane, musisz zrobić coś takiego jak ustanowienie protokołu dotyczącego kolejności uzyskiwania blokady, aby uniknąć zakleszczeń. Bardzo łatwo jest popełnić trudny do wykrycia błąd. STM ratuje cię przed całym tym bólem.
źródło