Follow my new blog

Freitag, 6. Juli 2007

Mein aktuelles Steckenpferd: Software Transactional Memory

Früher hatte Vati die elektrische Eisenbahn als Steckenpferd. Und heute? Heute hat Vati einen Windows Media Edition PC, der ihn nicht mehr zur Ruhe kommen lässt ;-) Nur ich tanze da wohl aus der Reihe. Aber ich habe ja auch kein Auto. Die Media Edition interessiert mich nicht, dafür aber Software Transactional Memory (STM). Das (!) ist cool. Viel cooler als an einem PC rumzuschrauben :-)

Und was soll so ein STM? Der macht z.B. die Programmierung mit mehreren Threads einfacher. Statt den Zugriff auf gemeinsame in-memory Ressourcen durch ausgeklügelte Sperren zu synchronisieren, arbeiten Sie einfach mit Transactionen. Genau: Transactionen wie bei Datenbanken - nur eben nicht auf persistenten Daten, sondern im Hauptspeicher!

Wem das aber noch nicht cool genug erscheint, der kann damit auch ohne Multithreading Undo-Lösungen basteln. Und das nicht nur auf einer Ebene, sondern auch echt geschachtelt. Das kann nicht mal SQL Server :-)

Und wer das noch nicht cool findet, der kann auch verteilte Transaktionen fahren: Mit System.Transactions eine Transaction öffnen, auf SQL Server zugreifen und Veränderungen im STM vornehmen - und am Ende alles zusammen committen oder zurückrollen.

Hier das kanonische Beispiel für Transaktionen mit dem .NET Software Transactional Memory (NSTM) realisiert: Überweisung eines Betrags von einem Konto auf ein anderes.

    1 INstmObject<double> myAccount;

    2 INstmObject<double> yourAccount;

    3 

    4 myAccount = NstmMemory.CreateObject<double>(1000);

    5 yourAccount = NstmMemory.CreateObject<double>(500);

    6 

    7 using (INstmTransaction tx = NstmMemory.BeginTransaction())

    8 {

    9     double amountToTransfer = 150;

   10 

   11     myAccount.Write(myAccount.Read() - amountToTransfer);

   12     yourAccount.Write(yourAccount.Read() + amountToTransfer);

   13 

   14     tx.Commit();

   15 }

   16 

   17 Console.WriteLine("My account balance: {0}", myAccount.Read());

   18 Console.WriteLine("Your account balance: {0}", yourAccount.Read());

In Zeile 16 hat der Transfer entweder komplett geklappt oder gar nicht. Inkonsistenzen, die durch einen Fehler in der Verarbeitung (Zeilen 9 bis 12) auftreten könnten, haben keine Chance, nach außen "durchzulecken". Wie gesagt: das ist wie mit Transaktionen bei Datenbanken. Wer sich den Code genau ansieht, wird das feststellen und auch sehen, dass er sehr dicht an Code ist, den man mit "normalen" Variablen geschrieben hätte.

NSTM ist mein Versuch der Implementation von STM, nachdem ich von dem Konzept neulich gehört hatte. Da war ich fasziniert und hab ne Menge drüber gelesen. Aber dann musste ich es einfach ausprobieren. Allemal, da die verfügbaren Implementationen alle irgendwie hinken. Entweder in Java realisiert oder unter Zuhilfenahme von Unmanaged Code oder nur für Haskell oder irgendwie nicht dem "normalen" Programmiermodell entsprechend, das wir von Transaktionen kennen. Also hab ich das gemacht, was alle Entwickler gern tun: ich habe meine eigene Infrastruktur gebastelt. Und es hat Spaß gemacht :-)  Aber dafür ist ein Steckenpferd ja auch da.

Wer mehr über NSTM erfahren will, kann in meinem englischen Blog eine ausführliche Darstellung lesen. Das Thema hab ich für international interessant gehalten und deshalb dort zuerst darüber geschrieben. Man sehe es mir in der deutschen Community nach.

Kommentare:

Marc Teufel hat gesagt…

Na, hier tut sich ja fast garnichts mehr. Schade, denn ich stöbere gerne in Deinem Blog, Ralf...

Liebe Grüsse,
Marc

Ralf Westphal - One Man Think Tank hat gesagt…

@Marc: Du hast Recht, im Augenblick ist es etwas still in meinem deutschen Blog. Manchmal muss ich halt auch arbeiten... ;-) Und manchmal muss ich auch etwas in meinem englischen Blog schreiben, so wie für NSTM. So ein Projekt geht über die deutschsprachige Community hinaus.

Aber keine Sorge: Es wird sich wieder etwas tun in meinem deutschen Blog.

-Ralf

Anonym hat gesagt…

Hallo Ralf,

die Diskussion in http://www.mycsharp.de/wbb2/thread.php?threadid=8764 könnte dich interessieren, weil es da im Prinzip auch um STM geht, auch wenn der Begriff dort nie verwendet wird.

herbivore

Anonym hat gesagt…

Hallo ich muss sagen, dass ich auf Thema gerade erst gestoßen bin und erstmal wissen will in wie fern die Transaktionen gekapselt sind? Bedeutet STM auf wenn ich z.B. einen Filereader benutze erst auf die Ressourcen (File) zugegriffen wird wenn ich ein commit machen? Sorry ist mit Sicherheit eine recht triviale Frage aber wie gesagt bin gerade erste auf das Thema gestoßen und versuche es einzuordnen Danke

Ralf Westphal - One Man Think Tank hat gesagt…

@Anonym: Ein STM verwaltet Speicher. Mehr nicht. Genauso wie eine DB Speicher verwaltet. Bei der DB liegt der auf der Platte, bei einem STM im Hauptspeicher.

STM wie DB machen den Umgang mit diesem Speicher transaktional. "Speichereinheiten" (Datensätze, Objekte) kann man innerhalb einer Tx ganz oder gar nicht (atomic, isolated) verändern.

Das war´s. Kontrolle über den Zugriff auf Dateien oder Bildschirm übt ein STM nicht aus.

-Ralf