Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: So 25.11.07 19:42 
In meiner kleinen Delphi 2005/Firebird 2.03 / IBX / Anwendung arbeiten zwei Personen gleichzeitig mit dem Programm. Wobei Person 1 Daten eigentlich nur ansieht, und Person 2 permanent Daten hinzufügt. Es kann jedoch passieren, dass auch Person 1 Daten verändert. Da die Vorgänge manchmal komplex sind, sind diese Änderungs-Routinen mit try finally ausgestattet, wobei im Fehlerfall dort ein Rollback durchgeführt wird.
Ich bin in der DB-Programmierung noch ein Anfänger, und überlege gerade was des beste Weg ist, damit dem Anwender 1 relativ aktuelle Daten angezeigt werden. Alle Routinen die zum Anzeigen der aktuellen Daten nötig sind habe ich in der Prozedur "sqlupdate" gekapselt, hier wird jedoch auch ein commit aufgerufen, und alle Änderungen in die Datenbank geschrieben. Es wäre ausreichend, wenn alle 10 Minuten die Anzeige aktualisiert wird.

Mein Lösungsansatz:
Mittels application.onidle wird geprüft, ob 10 Minuten vergangen sind. Wenn dies der Fall ist, wird sqlupdate aufgerufen.

Meine Fragen zu dieser Lösung:
Die Delphi Hilfe zu onidle ist spärlich, und ich bin nicht zu 100% sicher, dass OnIdle wirklich nur dann aufgerufen wird, wenn das Programm gerade in keiner (!!) Routine steckt, und z.B. auf einen Mausklick wartet. Weil dann wäre ein SQLUpdate fatal: Wenn Anwender 1 gerade eine Veränderung der Daten durchführt, welche jedoch Fehlerhaft sind und ein Rollback am Ende durchgeführt werden soll. Würde nämlich dazwischen ein SQLUpdate durchgeführt werden, wäre das Rollback wirkungslos, und die Daten in der DB mehr oder weniger inkonsistent.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 25.11.07 19:53 
Hier wäre vielleicht die Verwendung von Datenbankevents eine Option

_________________
Markus Kinzler.
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mo 26.11.07 13:17 
Danke für den Hinweis. Die Nutzung von Alerts / Datenbankevents ist die Lösung. Ich werde noch ein wenig weiterforschen müssen um die perfekte Lösung zu finden, was mich noch ein wenig stört, ist dass dieses Werkzeug recht feingliedrig ist, so scheint es dass ich für jede Tabelle mehrere Trigger definieren muss, was bei grossen Datenbanken sicher sinnvoll ist. Bei meinen 12 Tabellen würde es jedoch reichen, wenn es ein "globales" event geben würde, wie z.B. Datenbank geändert, anstelle von Tabelle geändert. Vielleicht wäre es auch möglich bestimmte Systemtabellen auszulesen, um zu erfahren, ob zwischenzeitlich Änderungen in der Datenbank durchgeführt werden.