Multithreading, Transactions und SQLite

Zhavok

Neues Mitglied
Hallo zusammen,
ich bastle gerade einen Server in C++. Damit die Verbindung nicht geblockt wird wenn ein Client gerade verbunden ist, habe ich einen Threadpool der die Verbindungen verwaltet. Jeder Thread kann auf eine eine gemeinsame Datenbank zugreifen. Nun hab ich mich mal etwas mit Datenbanken beschäftigt und bin auf das Thema Transactions gestoßen. Da habe ich mir überlegt ob und falls ja, wann ich diese verwenden sollte. Ich möchte ja an sich Anomalien vermeiden.
 

alinnert

Mitglied
Hallo,

also kurz zusammengefasst: Mit Transaktionen kannst du mehrere Operationen an einer Datenbank zusammenfassen und sie gebündelt auf die Datenbank loslassen. Das verhindert, dass zusammengehörige Aktionen nicht teilweise durchgeführt werden und einen ungültigen Datenbestand hinterlassen, sollte der Server abstürzen, Strom ausfallen oder ähnliches. Alle Aktionen innerhalb einer Transaktion werden nur vollständig oder gar nicht in der Datenbank festgeschrieben. Mit Multi-Threading hat das erstmal nichts zu tun. Das ist auch in einer Single-Threaded-Umgebung sinnvoll.
 

Zhavok

Neues Mitglied
Ah ok. Dann hab hab das falsch verstanden. Ich dachte durch die Isolationslevel bei Transaktions könnte man irgendwie vermeiden, dass vielleicht ein Thread von mir liest was ein anderer gerade schreibt.
 

alinnert

Mitglied
Ok, die Isolation Level sind mir jetzt auch neu. Aber doch, da hast du Recht. Das ist zwar nicht der Hauptgedanke hinter Transaktionen, aber in Kombination mit entsprechend gewähltem Isolation Level führt das dazu, dass verhindert wird, dass Thread A unfertige Datenbankänderungen von Thread B lesen kann.
 

Zhavok

Neues Mitglied
Nur glaube ich nicht, dass es schlau ist deswegen jetzt einfach blind alles in Transaktionen zu verwandeln. Ich denke wenn ich dieses Aspekt so umsetzen wöllte könnte ich auch einfach die Threads mit mutual exclusions sichern wenn sie etwas in der DB anstellen. Das wäre wahrscheinlich einfacher und genau so sicher.
 

alinnert

Mitglied
Über das Thema Multithreading und Mutex weiß ich leider zu wenig, um das mit Transaktionen vergleichen zu können, auch was die Sicherheit angeht. Aber für eine Transaktion brauchst du nur zwei zusätzliche SQL-Befehle (BEGIN TRANSACTION; und COMMIT;). Je nach DB-Treiber kann die Implementierung aber anders aussehen. Ich hab schon Transaktionen in Callback-Form gesehen, was das für mich ein Stück weniger lesbar macht. Aber vielleicht weiß da jemand anders mehr darüber.
 

Zhavok

Neues Mitglied
Ne alles ok. Ich kann ja eh nicht alles in Transaktionen packen in der Hoffnung, dass nichts schief geht. Das wäre sehr unschön. Entweder sichere ich meine Threads oder lebe einfach damit. Das werde ich dann testen :)
 

Zhavok

Neues Mitglied
Vielen Dank für Info. Das ist gut zu wissen. Dann nutze ich das natürlich auch gleich so (y)
 
Oben Unten