/* Page prose (de) */
"Reentrancy" = "# Reentrancy: der subtile Teil\n\nHier überraschen Actors die Leute. Ein Actor garantiert eine Aufgabe nach der anderen drinnen, aber \"nach der anderen\" hat eine genaue Bedeutung. Immer wenn eine Actor-Methode auf ein `await` trifft und **suspendiert**, *tritt sie aus dem Actor heraus*, während sie wartet. Der Actor ist nun frei, also **kann eine andere Aufgabe eintreten**. Das nennt man **Reentrancy** (Wiedereintritt): der Actor kann während einer Suspendierung wieder betreten werden.\n\nDie Konsequenz ist scharf: **jeder Wert, den du vor einem `await` liest, kann sich geändert haben, bis du fortsetzt.** Der Zustand bleibt über eine Suspendierung hinweg nicht eingefroren.\n\nSieh zu, wie das einen echten Fehler verursacht. Dieser Tresor prüft den Kontostand, macht mitten in der Transaktion einen asynchronen Schritt (stell dir vor, ein Freigabedienst wird kontaktiert) und zieht dann ab.";
"Reentrancy-2" = "**Sieh es laufen:** beide Kassierer melden Erfolg, und der Endstand ist **`-60`**: das Konto ist überzogen, obwohl jede Abhebung sorgfältig geprüft hat, dass genug Geld da war. Hier ist die Abfolge:\n\n1. Kassierer A tritt ein, prüft `100 >= 80` (besteht), trifft dann auf `await` und **suspendiert**, wodurch er den Actor freigibt.\n2. Mit dem freien Actor tritt Kassierer B ein, prüft `100 >= 80` (besteht ebenfalls; A hat noch nicht abgezogen!), trifft dann auf `await` und suspendiert ebenso.\n3. Beide wachen auf und ziehen ab: `100 - 80 = 20`, dann `20 - 80 = -60`.\n\nDer Guard war für beide wahr, weil sich der Kontostand nicht änderte, *während einer von beiden suspendiert war*, aber er änderte sich *zwischen der Prüfung und dem Abzug*. Diese Lücke ist das `await`. Das Prüfen-dann-Handeln war doch nicht atomar.\n\n* callout(Probier es aus): Ändere den Sleep auf `.seconds(2)`; die Überziehung passiert trotzdem. Länger warten ist nicht die Lösung; die Lücke über das `await` hinweg zu schließen schon.\n\n[Zurück](@previous)  |  Seite 4 von 7  |  [Weiter: Sich gegen Reentrancy absichern](@next)";
