Transaktionen und Connections
-
- Beiträge: 813
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz 2.2.6
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Transaktionen und Connections
Hi,
in einem Anwendungsprogramm möchte ich Zb ein Formular mit einem "Abbrechen" Button ausstatten. In diesem Formular sind eine Anzahl von Änderungsmöglichkeiten angeboten deren Änderungen ich transaktionssichern möchte.
Also: Zuerst das Formular nur anzeigen -- Druck auf einen "Edit" Button -- Transaktion starten -- Änderungen erlauben -- User drückt entweder aus Speichern, dann Wird die Transaktion committed oder beim Abbrechen Button wird ein Rollback gemacht.
Meinetwegen auch mit Cachedupdates.
Nun arbeitet jemand am Formular_A, ist mitten in der Arbeit und jemand ruft an. Er braucht ein Formular_B das er aufrufen kann ohne Formular_A zu schließen.
Soweit ist das kein Problem, aber:
Braucht jede Transaktion (SQLDB oder ZEOS) eine eigene Connection zur DB oder können mehrere Transaktionen über ein einzelnes ConnectionObjekt laufen ?
Dementsprechend würde jedes Formular seine eigene TSQLtransaction brauchen.
Nachdem da so einige Formulare Frames auf mich zukommen würde ich das in einen Vorfahren einbauen wollen.
Das hat natürlich auch Auswirkungen auf den DB-Server der bei Mehrbenutzerbetrieb der Anwendung auch gleich um ein vielfaches mehr Connections bereitstellen muß.
THX
in einem Anwendungsprogramm möchte ich Zb ein Formular mit einem "Abbrechen" Button ausstatten. In diesem Formular sind eine Anzahl von Änderungsmöglichkeiten angeboten deren Änderungen ich transaktionssichern möchte.
Also: Zuerst das Formular nur anzeigen -- Druck auf einen "Edit" Button -- Transaktion starten -- Änderungen erlauben -- User drückt entweder aus Speichern, dann Wird die Transaktion committed oder beim Abbrechen Button wird ein Rollback gemacht.
Meinetwegen auch mit Cachedupdates.
Nun arbeitet jemand am Formular_A, ist mitten in der Arbeit und jemand ruft an. Er braucht ein Formular_B das er aufrufen kann ohne Formular_A zu schließen.
Soweit ist das kein Problem, aber:
Braucht jede Transaktion (SQLDB oder ZEOS) eine eigene Connection zur DB oder können mehrere Transaktionen über ein einzelnes ConnectionObjekt laufen ?
Dementsprechend würde jedes Formular seine eigene TSQLtransaction brauchen.
Nachdem da so einige Formulare Frames auf mich zukommen würde ich das in einen Vorfahren einbauen wollen.
Das hat natürlich auch Auswirkungen auf den DB-Server der bei Mehrbenutzerbetrieb der Anwendung auch gleich um ein vielfaches mehr Connections bereitstellen muß.
THX
- af0815
- Lazarusforum e. V.
- Beiträge: 6117
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Transaktionen und Connections
Transaktionen sind so kurz wie möglich zu halten, lernt man in jeden MS DB Kurs.
Der Server muss für jede Transaktion Ressourcen halten, noch dazu wird normalerweise die DB mit einem Lock versehen, der je nach Transaktionisolationsmodus bis hin zur Sperre von Tabellen bzw. Teilbereichen führt. Das in Folge zu deadlocks mit anderen Transaktionen führen. Bei den Administrationskursen zum MSSQL ist dieses und andere Design Themen schon etwas wo man sich beschäftigen muss.
Wenn ich bei einer App draufkomme, das der Programmiere den User über die Laufzeit der Transaktion bestimmen lässt, ist die App gesperrt. Sowas kann dir als Admin am Server nur Ärger bereiten.
Der Server muss für jede Transaktion Ressourcen halten, noch dazu wird normalerweise die DB mit einem Lock versehen, der je nach Transaktionisolationsmodus bis hin zur Sperre von Tabellen bzw. Teilbereichen führt. Das in Folge zu deadlocks mit anderen Transaktionen führen. Bei den Administrationskursen zum MSSQL ist dieses und andere Design Themen schon etwas wo man sich beschäftigen muss.
Wenn ich bei einer App draufkomme, das der Programmiere den User über die Laufzeit der Transaktion bestimmen lässt, ist die App gesperrt. Sowas kann dir als Admin am Server nur Ärger bereiten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 17
- Registriert: Fr 21. Feb 2020, 19:17
- OS, Lazarus, FPC: Win10/64
- CPU-Target: 64 Bit
- Wohnort: Osterholz-Scharmbeck
Re: Transaktionen und Connections
Deshalb habe ich für jede Entität ein Objekt mit allen Datenfeldern. Das Objekt wird aus der/den Tabellen der DB kreiert und dann an die Form zum Show/Edit übergeben.Transaktionen sind so kurz wie möglich zu halten, lernt man in jeden MS DB Kurs.
Die Form selber kennt keine DB. Änderungen werden an den Datenfeldern der Objekte vorgenommen.
Die Objekte werden in einer Factory erzeugt.
Das Speichern in der DB übernehmen die Objekte selber.
-
- Beiträge: 813
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz 2.2.6
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Transaktionen und Connections
In euren Antworten ist schon einiges drin worauf zu achten ist und was hält noch tiefer geht.
So eine Factory ist nicht Mal eben so zusammengeklickt.
Meine Frage ob eine Transaktion eine eigene Connection braucht ist noch offen.
So eine Factory ist nicht Mal eben so zusammengeklickt.
Meine Frage ob eine Transaktion eine eigene Connection braucht ist noch offen.
Re: Transaktionen und Connections
Kommt auf die Datenbank an. Bei Firebird kann eine Connection mehrere Transaktionen haben, aber das ist eine echte Ausnahme. Alle anderen (man möge mich korrigieren) benötigen eine Connection pro Transaktion.Meine Frage ob eine Transaktion eine eigene Connection braucht ist noch offen.
- gladio
- Beiträge: 215
- Registriert: Sa 21. Jun 2014, 06:15
- OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Transaktionen und Connections
Im Allgemeinen reicht eine Connection zwischen Anwendung und DB aus.
Öffnen der Connection bei Programmstart, bzw. wenn sie gebraucht wird, Schließen bei Programmende, bzw. wenn nicht mehr gebaucht wird.
Alle Transaktionen laufen dann über diese Connection.
Mehrere Connections sind möglich, Geschmackssache. Wird dann irgendwann unübersichtlich.
Notwendig bei mehreren Datenbanken (nicht Tabellen) in der Anwendung.
Öffnen der Connection bei Programmstart, bzw. wenn sie gebraucht wird, Schließen bei Programmende, bzw. wenn nicht mehr gebaucht wird.
Alle Transaktionen laufen dann über diese Connection.
Mehrere Connections sind möglich, Geschmackssache. Wird dann irgendwann unübersichtlich.
Notwendig bei mehreren Datenbanken (nicht Tabellen) in der Anwendung.
-
- Beiträge: 813
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz 2.2.6
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Transaktionen und Connections
hmm... das sind jetzt mal schon zwei gegensätzliche Antworten --- hmmmm
- gladio
- Beiträge: 215
- Registriert: Sa 21. Jun 2014, 06:15
- OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Transaktionen und Connections
ähm, meine Weisheiten beziehen sich auf Erfahrungen zu Einzelplatzanwendungen.
-
- Beiträge: 813
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz 2.2.6
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Transaktionen und Connections
Es geht definitiv um eine Multiuseranwendung im Netzwerk.
Mehrere Benutzer bearbeiten gleichzeitig unterschiedliche (oder eben fallweise die gleichen) Geschäftsprozesse ohne dass sie voneinander wissen.
Ebenso kann es zu unterschiedlichen Laufzeiten kommen (Stichwort Remote oder Home Office).
Genau das muss die Applikation in Zusammenarbeit mit der Datenbank managen.
Es geht in diesem speziellen Fall nicht darum welche Strategien eingesetzt werden sollen -- das ist längst geklärt und erprobt.
Es geht darum ob man zur Umsetzung in Lazarus (wohl eher mit ZEOS als mit SQLDB) für die gleichzeitige Bearbeitung unterschiedlicher Bereiche Pro DB-Connection mehrere Transaktionen pro DB-Connection braucht oder ob man mehrere DB-Verbindungen nutzen muss die jede ihre eigene Transaktion hat.
Das wirkt sich auch auf den Speicherbedarf am SQL-Server aus.
Mehrere Benutzer bearbeiten gleichzeitig unterschiedliche (oder eben fallweise die gleichen) Geschäftsprozesse ohne dass sie voneinander wissen.
Ebenso kann es zu unterschiedlichen Laufzeiten kommen (Stichwort Remote oder Home Office).
Genau das muss die Applikation in Zusammenarbeit mit der Datenbank managen.
Es geht in diesem speziellen Fall nicht darum welche Strategien eingesetzt werden sollen -- das ist längst geklärt und erprobt.
Es geht darum ob man zur Umsetzung in Lazarus (wohl eher mit ZEOS als mit SQLDB) für die gleichzeitige Bearbeitung unterschiedlicher Bereiche Pro DB-Connection mehrere Transaktionen pro DB-Connection braucht oder ob man mehrere DB-Verbindungen nutzen muss die jede ihre eigene Transaktion hat.
Das wirkt sich auch auf den Speicherbedarf am SQL-Server aus.
- af0815
- Lazarusforum e. V.
- Beiträge: 6117
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Transaktionen und Connections
<ich würde sagen Transaktion und den Transaktion Isolations Level muss man dabei betrachten. Soweit mir bekannt ist, haben alle professionale System ähnliche Ansätzecharlytango hat geschrieben: ↑Mo 24. Jul 2023, 19:29Das wirkt sich auch auf den Speicherbedarf am SQL-Server aus.
Allgemein:
https://de.wikipedia.org/wiki/Isolation_(Datenbank)
Spezieller:
https://learn.microsoft.com/en-us/sql/o ... rver-ver16
https://www.postgresql.org/docs/current ... n-iso.html
Ich kann da nur über MS-SQL spezieller reden,
Als Faustregel eine Connection per Server, besser per DB, weil man damit man dem Server wieder interne Routingarbeit abnimmt. Vor allen, weil Sperren, Transaktionen und Precompilate IMHO per DB gehalten werden. Gerade im Multiuser Bereich ist die Transaktion so kurz wie möglich zu halten um deadlocks zu vermeiden.
Zeos hat meiner Erfahrung nach, noch mehr Feintuning Möglichkeiten als SQLDB. ABer es ist nicht immer 100% in sync mit dem aktuellesten Lazarus. Wenn man nur stabile Versionen von Lazraus verwendet gibt es keine Probleme.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).