Was ist eine Race Condition?

Wir hatten in einem Projekt den Fall, dass mehrere Systeme Kundendaten in eine MQ geschrieben haben. Diese Kundendaten mussten am Zielsystem natürlich so schnell wie möglich verarbeitet werden. Jetzt gab es den Spezialfall, dass, wenn ein Kunde namens Altair im Zielsystem noch nicht existierte, dieser erstellt werden sollte.

Das System Kuchen schickte also seinen Kunden Altair in das Zielsystem. Dieses stellte fest, dass es den Namen noch nicht gab, und erstellte einen Kundeneintrag für diesen. Traditionsgemäss brauchte dieses Eröffnen eines Kundenkontos dabei einige Zeit, das im Hintergrund viele Dinge beachtet werden mussten.

Was passierte nun aber, wenn das System Müesli ebenfalls den Kunden Altair auf den Weg schickte, zeitgleich wie das System Kuchen? Dann entsteht eine sogenannte Race Condition, ein Zeitrennen dieser beiden Aufträge.

Warum ist das ein Problem?

Nun, wenn die beiden Aufträge den exakt gleichen Kunden erstellen würde, wäre das nicht so schlimm. Was ist jetzt aber, wenn eine ihre Daten aus unterschiedlichen Orten (etwa verschiedene Benutzeroberflächen) holen? Dann gibt es vielleicht, je nachdem welches System gewinnt, einen männlichen oder einen weiblichen Altair.

Oder ein falscher Kontostand? Nicht gut…

Noch schlimmer wäre es, wenn bei der gleichzeitigen Verarbeitung dieser Kundeneröffnungen ein Betrag zuerst abgefragt werden müsste, bevor man ihn wieder in die Datenbank schreiben würde.

Wenn etwa das System Kuchen zuerst den existierenden Kunden Ezio aus der Datenbank liest, dessen Kontostand abfragt und diesen dann um 20 Franken erhöht. Aus ursprünglich 50 Franken wird so ein Betrag von 70 Franken, welcher wieder in die Datenbank geschrieben wird.

Liest jetzt aber das System Müesli zur exakt gleichen Zeit die Daten, erhöht diese um 30 Franken auf 80 Franken, und schreibt diese in die Datenbank, nachdem System Kuchen seinen Arbeit gemacht hat, steht am Ende ein Betrag von 80 Franken – statt der Summe von 50 + 20 + 30 = 100 Franken.

Sehr gefährlich!

Okay und was macht man dagegen?

In der Programmierung gibt es viele Mechanismen, die sich diesem Problem annehmen. Wer sich dafür interessiert, wird früher oder später über die Begriffe Threadsafe, Concurrency oder Synchronize stolpern.

Das ist aber wieder eine ganz andere Geschichte…

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s