Access Transaction

26/04/2008 - 15:40 von Oliver Grohe | Report spam
Hallo,
um Fehler in der DB zu vermeiden schreibe ich (umfangreiche) Aktionen über
eine Transaktion in meine db acces 2003).
Eine danach folgende Aktion (eine neue Connection ohne Transaktion) liest
nun die db. - aber manchmal sind die daten noch nicht da.
Wie kann man sichstellen, daß ein select befehl erst dann ausgeführt wird,
wenn alle vorhergehenden connection ihre Daten tatsàchlich in der db
abgegeben haben?
ich habe also folgende reihenfolge:
connection mit transaktion
commit
close

dann neue connection mit select ...
- aber die daten sind noch nicht da

was mache ich falsch?

viele grüße von oliver
 

Lesen sie die antworten

#1 Peter Götz
26/04/2008 - 18:27 | Warnen spam
Hallo Oliver,

um Fehler in der DB zu vermeiden schreibe ich (umfangreiche)
Aktionen über eine Transaktion in meine db acces 2003).



Welche Fehler willst Du damit vermeiden?

Eine danach folgende Aktion (eine neue Connection ohne
Transaktion) liest nun die db. -



Du führst einen Select-Command über ein zweites
Connectionobjekt aus?
Wenn ja, dann bekommst Du natürlich ein Problem
mit dem Caching der Jet-Engine.

aber manchmal sind die daten noch nicht da.



Ja, weil die Jet-Engine mit sog. Caching arbeitet.
Das bedeutet, jedes OleDbConnection-Objekt
verwaltet einen eigenen Datenpuffer. Änderungen
liegen erst mal nur in diesem Datenpuffer und werden
erst dann in die phys. *.mdb übertragen, wenn
Windows bzw. die Jet-Engine nichts besseres zu
tun haben. Dabei kann es zu Verzögerungen von
mehreren Sekunden kommen. Das Aktualisieren bzw.
Wegschreiben des Puffer wird durch das Commit einer
Transaktion erzwungen.
Du solltest für deine Zugriffe auf die *.mdb immer nur
ein einziges Connectionobjekt nutzen. Die Connection
wird dabei am einfachsten beim Programmstart
mit ausgeschaltetem Connectionpooling
(Ole DB Services = -4 im Connectionstring) geöffnet
und erst beim Programmende wieder geschlossen.
Alle DB-Zugriffe erfolgen wàhrend der gesamten
Programmlaufzeit über dieses einzige Connection-
objekt und somit auch über den einzigen Datenpuffer.

Wie kann man sichstellen, daß ein select befehl erst
dann ausgeführt wird, wenn alle vorhergehenden
connection ihre Daten tatsàchlich in der db
abgegeben haben?



Gar nicht, weil es unbestimmt ist, zu welchem Zeitpunkt
der geànderte Inhalt des Datenpuffer tatsàchlich in die
phys. DB geschrieben wird. Man kann jedoch, wie schon
oben erwàhnt, das sofortige Wegschreiben der Daten
durch ein CommitTrans erzwingen.

ich habe also folgende reihenfolge:
connection mit transaktion



Was heisst "connection mit transaktion"?
Erst mal einfach eine Connection zur *.mdb mit
ausgeschaltetem Connectionpooling öffnen.

BeginTrans
Command ..
Command..
CommitTrans


commit
close



Nix close.
Connection weiter für nachfolgende Commands, egal
ob in Transaktion eingeschlossen oder nicht, geöffnet
lassen. Alle DB-Zugriffe immer nur über dieses
einzige Connection-Objekt ausführen um so
unterschiedliche Datenstànde in verschiedenen
Datenpuffern verschiedener Connectionobjekte zu
vermeiden.

dann neue connection mit select ...



Keine neue Connection, sondern die erste Connection,
die nach wie vor geöffnet bleibt nutzen.

- aber die daten sind noch nicht da



Im Datenpuffer einer neuen Connection noch nicht,
im Datenpuffer der ersten Connection aber schon.


was mache ich falsch?



Du verwendest mehrere Connectionobjekte mit
entsprechend mehreren Datenpuffern, deren
Datenstànde nicht unbedingt synchron sind.

Einfach nur eine einziges Connectionobjekt für
alle Zugriffe auf eine bestimmte *.mdb nutzen
und dann gibts auch keine Probleme mit noch
nicht sichtbaren Daten.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen