Es gibt mehrere Gründe, warum dies nicht funktioniert. Wie Alan Thompson schreibt, werden Transaktionen mit einem einzelnen Thread verknüpft. Wenn Sie also einen neuen Thread erstellen, verlieren Sie Ihre Transaktion. Ein anderes Problem ist der dynamische Bereich von dosync
. Das gleiche Problem würde sich ergeben, wenn Sie
((dosynC#(alter number inc)))
Hier schrieben wir eine Funktion innerhalb des dosync
Rahmen schaffen, und lassen Sie diese Funktion das Ergebnis der dosync
sein. Dann rufen wir die Funktion von außerhalb des dosync
Blocks auf, aber natürlich läuft die Transaktion nicht mehr.
Das ist sehr ähnlich zu dem, was Sie tun mit future
: future
erstellt eine Funktion und führt es dann auf einen neuen Thread, einen Griff zurück, mit dem Sie den Fortschritt dieses Threads überprüfen können. Selbst wenn Cross-Thread-Transaktionen erlaubt wären, hätten Sie hier eine Wettlaufsituation: Schließt der dosync
Block seine Transaktion, bevor oder nachdem der alter
Aufruf in der future
ausgeführt wird?