Einer der Hauptvorteile des Software-Transaktionsspeichers, der immer erwähnt wird, ist die Kompositionsfähigkeit und Modularität. Verschiedene Fragmente können kombiniert werden, um größere Komponenten herzustellen. In sperrbasierten Programmen ist dies häufig nicht der Fall.
Ich suche ein einfaches Beispiel, das dies mit tatsächlichem Code veranschaulicht. Ich würde ein Beispiel in Clojure bevorzugen, aber Haskell geht es auch gut. Bonuspunkte, wenn das Beispiel auch einen sperrbasierten Code enthält, der nicht einfach zusammengesetzt werden kann.
Antworten:
Angenommen, Sie haben einige Bankkonten:
Und eine atomare "Transfer" -Funktion:
Welches funktioniert wie folgt:
Sie können dann die Übertragungsfunktion einfach zusammenstellen, um eine Transaktion auf höherer Ebene zu erstellen, z. B. die Übertragung von mehreren Konten:
Beachten Sie, dass alle Mehrfachübertragungen in einer einzigen kombinierten Transaktion stattfanden, dh es war möglich, die kleineren Transaktionen zu "komponieren".
Dies mit Sperren zu tun, würde sehr schnell kompliziert werden: Wenn die Konten einzeln gesperrt werden müssten, müssten Sie beispielsweise ein Protokoll für die Reihenfolge der Sperrenerfassung erstellen, um Deadlocks zu vermeiden. Es ist sehr leicht, einen schwer zu erkennenden Fehler zu machen. STM bewahrt Sie vor all diesen Schmerzen.
quelle