Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: Windows | Windows Server-
Transaktionen
ESE-Transaktionen sind logische Verarbeitungseinheiten, die steuern, wie eine Anwendung Zeilen in der Datenbank sieht und bearbeitet. Ihre Anwendung kann Transaktionsspeicherpunkte verwenden, um zu bestimmen, ob eine bestimmte Gruppe von Änderungen an der Datenbank beibehalten oder verworfen werden soll. Alle Transaktionen in ESE sind atome, konsistente, isolierte und dauerhafte (ACID) wie unten beschrieben:
- Atomic: Alle Aktualisierungen in der Transaktion werden entweder in der Datenbank angezeigt oder verworfen.
- konsistent: Die Datenbank beginnt immer in einem Rechtszustand und endet immer in einem anderen Rechtszustand. Bei ESE-Anwendungen steuert das Datenbankmodul einige einfache Einschränkungen, z. B. die Eindeutigkeit eines eindeutigen Indexes, aber die Anwendung selbst definiert fast alle anderen Aspekte, was die Datenbank in einem Rechtszustand bedeutet.
- Isolation: Transaktionen sind von Updates anderer Sitzungen isoliert. Bei einer Transaktion wird nie ein teiliger Satz von Änderungen angezeigt, die von einer anderen Transaktion vorgenommen wurden.
- dauerhaft: Nachdem das Datenbankmodul bestätigt hat, dass eine Transaktion zugesichert wurde, sind die Änderungen in der Datenbank dauerhaft. Die Haltbarkeit einer Transaktion kann aus Leistungsgründen optional aufgehoben werden.
Transaktionen werden innerhalb der Grenzen der Aufrufe von JetBeginTransaction und JetCommitTransaction- oder JetRollback-ausgeführt. Wenn die Anwendung die Transaktion eingibt, wird die Datenbank zu dem Zeitpunkt, zu dem die Transaktion beginnt, eingefroren angezeigt. Dies wird als Momentaufnahmeisolation bezeichnet. Wenn die Transaktion durch Aufrufen JetRollback-beendet wird, werden keine der vorgänge, die in der Transaktion ausgeführt werden, an die Datenbank gebunden. Wenn der Prozess oder der Computer abstürzt, bevor JetCommitTransaction- aufgerufen wird, entspricht es dem Aufrufen JetRollback-.
Dieses Verfahren zeigt, wie Sie eine Transaktion starten und übernehmen, die Daten in einer Datenbank liest und aktualisiert.
So starten und übernehmen Sie eine Transaktion
Rufen Sie JetBeginTransaction oder JetBeginTransaction2 mit der Sitzungs-ID auf, um die Transaktion zu starten.
Bewegen Sie den Cursor auf den gewünschten Datensatz, indem Sie JetMove- aufrufen, wobei JET_MoveFirst im cRow--Parameter angegeben ist. Weitere Informationen zum Verschieben des Cursors finden Sie im Thema Indizierung im Thema "Tabelle".
Rufen Sie JetGetTableColumnInfo- für den aktuellen Datensatz auf, wobei JET_ColInfo im parameter InfoLevel angegeben ist, um die Spalten-ID für die Spalte abzurufen. Die Spalten-ID wird in der JET_COLUMNDEF-Struktur zurückgegeben.
Rufen Sie JetSetColumn- mit der Sitzungs-ID, Tabellen-ID und Spalten-ID der aktualisierten Spalte auf. Die Spaltendaten sind im pvData Parameter enthalten.
Rufen Sie JetCommitTransaction- auf, um die Transaktion in die Datenbank zu übernehmen.
Die Art und Weise, in der ein ESE-Datenbankmodul die Snapshotisolation implementiert, weist einige wichtige Unterschiede von herkömmlichen relationalen Datenbankisolations- und Sperrmodellen auf. Wenn eine Transaktion eine Zeile liest, kann sie immer ohne Fehlschlagen auf die Zeile zugreifen oder auf andere Sitzungen warten, um eine Sperre freizugeben. Wenn eine Transaktion versucht, eine Zeile zu aktualisieren, wird es erfolgreich sein, wenn es sich bei der ersten Sitzung um die Aktualisierung dieser Zeile handelt, d. h. der erste Writer gewinnt. Wenn die Sitzung nicht der erste Writer ist, schlägt sie sofort mit einem Schreibkonfliktfehler fehl. Die Sitzung muss dann die Transaktion abbrechen, warten (in der Regel über eine zufällige Verzögerung), damit die andere Transaktion ihre Änderungen festsetzt, und wiederholen Sie dann die Transaktion. Das Datenbankmodul bewirkt nicht automatisch, dass diese Sitzung wartet, bis die andere Transaktion die Aktualisierung abgeschlossen hat. In der Regel wird eine Transaktion getestet, ob sie eine Zeile innerhalb des JetUpdate-Aufrufs aktualisieren kann. Wenn die Zeile für die Aktualisierung nicht gesperrt werden kann, schlägt JetUpdate- mit JET_errWriteConflict fehl.
Sitzungen sind ab dem Zeitpunkt, zu dem die Transaktion am Ende der Transaktion beginnt, auf einen Thread beschränkt. Es wird empfohlen, alle Aktualisierungs- und Abrufvorgänge in einer Transaktion auszuführen. ESE unterstützt auch Schemaänderungen wie das Erstellen von Tabellen und das Hinzufügen von Spalten innerhalb der Transaktion. Sowohl Aktualisierungen als auch Schemaänderungen können in derselben Transaktion ausgeführt werden. Nach Abschluss der Transaktion mit JetCommitTransactionwird das Update in der Transaktionsprotokolldatei protokolliert. Diese Dateien können verwendet werden, um einen logisch konsistenten Zustand zu erhalten, wenn ein unerwarteter Prozess beendet oder das System heruntergefahren wird.
Transaktionen können bis zu 7 Ebenen mit übereinstimmenden Aufrufen von JetBeginTransaction- und JetCommitTransaction- oder JetRollback- verschachtelt werden. Auf diese Weise kann die Anwendung einen Teil der Transaktion zurücksetzen, ohne die gesamte Transaktion wieder ausführen zu müssen. Der geschachtelte Aufruf von JetCommitTransaction bedeutet, dass diese Verarbeitungsebene abgeschlossen ist; Die Transaktion wird jedoch erst an die Datenbank gebunden, wenn der äußerste Aufruf, um die Transaktion mit JetCommitTransactionzu übernehmen.
Escrow-Aktualisierungsspalten können gleichzeitig von mehreren Sitzungen aktualisiert werden, ohne dass bei Jet_errWriteConflict ein Fehler auftritt. Die JetEscrowUpdate--Funktion kann nur für Escrow-Spalten aufgerufen werden, Spalten, die mit Jet_bitColumnEscrowUpdate erstellt wurden.