Freigeben über


JetBeginTransaction-Funktion

Gilt für: Windows | Windows Server

JetBeginTransaction-Funktion

Die JetBeginTransaction-Funktion bewirkt, dass eine Sitzung eine Transaktion eingibt und einen neuen Speicherpunkt erstellt. Diese Funktion kann in einer einzelnen Sitzung mehrmals aufgerufen werden, um zusätzliche Speicherpunkte zu erstellen. Diese Speicherpunkte können verwendet werden, um Änderungen am Zustand der Datenbank selektiv beizubehalten oder zu verwerfen.

    JET_ERR JET_API JetBeginTransaction(
      __in          JET_SESID sesid
    );

Parameter

sesid

Die Sitzung, die für diesen Aufruf verwendet werden soll.

Rückgabewert

Diese Funktion gibt den Datentyp JET_ERR mit einem der folgenden Rückgabecodes zurück. Weitere Informationen zu möglichen ESE-Fehlern finden Sie unter Erweiterbare Speichermodulfehler und Fehlerbehandlungsparameter.

Rückgabecode

Beschreibung

JET_errSuccess

Der Vorgang wurde erfolgreich abgeschlossen.

JET_errClientRequestToStopJetService

Es ist nicht möglich, den Vorgang abzuschließen, da alle Aktivitäten auf der instance, die der Sitzung zugeordnet sind, aufgrund eines Aufrufs von JetStopService beendet wurden.

JET_errInstanceUnavailable

Es ist nicht möglich, den Vorgang abzuschließen, da für die instance, die der Sitzung zugeordnet ist, ein schwerwiegender Fehler aufgetreten ist, der erfordert, dass der Zugriff auf alle Daten widerrufen wird, um die Integrität dieser Daten zu schützen.

Dieser Fehler wird nur von Windows XP und späteren Versionen zurückgegeben.

JET_errNotInitialized

Es ist nicht möglich, den Vorgang abzuschließen, da die der Sitzung zugeordnete instance noch nicht initialisiert wurde.

JET_errRestoreInProgress

Es ist nicht möglich, den Vorgang abzuschließen, da ein Wiederherstellungsvorgang für die instance ausgeführt wird, die der Sitzung zugeordnet ist.

JET_errSessionSharingViolation

Dieselbe Sitzung kann nicht für mehrere Threads gleichzeitig verwendet werden. Dieser Fehler wird nur von Windows XP und späteren Versionen zurückgegeben.

JET_errTermInProgress

Es ist nicht möglich, den Vorgang abzuschließen, da die der Sitzung zugeordnete instance heruntergefahren wird.

JET_errTransTooDeep

Eine neue Transaktion kann nicht gestartet werden, da die Sitzung bereits die maximale Speicherpunkttiefe hat, die von der Datenbank-Engine zulässig ist.

Bei Erfolg befindet sich die bereitgestellte Sitzung innerhalb einer Transaktion. Wenn sich die Sitzung zuvor innerhalb einer Transaktion befand, wird ein neuer Speicherpunkt erstellt.

Bei einem Fehler bleibt der Transaktionszustand der Sitzung unverändert. Es wird keine Änderung des Datenbankzustands vorgenommen.

Bemerkungen

Die Datenbank-Engine stellt ein Momentaufnahme Isolationsmodell für ihre Transaktionen bereit. Dies bedeutet, dass, wenn eine Sitzung zum ersten Mal in einen Transaktionszustand wechselt, die gesamte Datenbank zu Beginn der Transaktion eingefroren wird. Eine Sitzung muss keine Daten lesen, da sie immer auf die entsprechende Version dieser Daten zugreifen kann. Dies bedeutet, dass eine Sitzung, die Daten aktualisiert, niemals verhindert, dass eine andere Sitzung diese Daten liest.

Eine weitere Folge der Verwendung von Momentaufnahme Isolation ist das Sperrmodell, das für Updates verwendet wird. Die Datenbank-Engine erteilt der ersten Sitzung, die sie anfordert, eine Schreibsperre für einen bestimmten Datenabschnitt. Diese Schreibsperre wird aufgehoben, wenn die Transaktion entweder committet oder vollständig abgebrochen wird, sodass sich die Sitzung nicht mehr in einer Transaktion befindet. Während eine Sitzung eine Schreibsperre enthält, wird jede andere Sitzung, die dieselbe Schreibsperre anfordert, erst blockiert, wenn die Schreibsperre verfügbar ist. Stattdessen schlägt diese zweite Sitzung sofort mit JET_errWriteConflict fehl. Um diesen Konflikt zu beheben, muss die zweite Sitzung ihre Transaktion vollständig abbrechen (oder committen), einige kurze Zeit warten, bis die erste Sitzung die Transaktion committet oder abbricht, und dann von vorne beginnen.

Um Momentaufnahme Isolation zu unterstützen, speichert die Datenbank-Engine alle Versionen aller geänderten Daten im Arbeitsspeicher seit dem zeitpunkt, zu dem die älteste aktive Transaktion in einer Sitzung zum ersten Mal gestartet wurde. Dies hat wichtige Auswirkungen auf Ihre Anwendung. Jedes Verhalten, das dazu führt, dass eine große Anzahl von Versionen im Arbeitsspeicher erstellt wird, kann dazu führen, dass der instance seine maximale Versionsspeichergröße aufgebraucht (weitere Informationen finden Sie unter JET_paramMaxVerPages unter Systemparameter). Ein solches Verhalten umfasst unter anderem sehr große Updates in einer einzelnen Transaktion und transaktionen mit sehr langer Ausführungsdauer. Daher ist es sehr wichtig, die Größe des Versionsspeichers für die erwartete Transaktionslast der Anwendung ordnungsgemäß zu konfigurieren. Es ist auch wichtig, die Anzahl der Updates, die in einer einzelnen Transaktion durchgeführt werden, zu begrenzen. Darüber hinaus ist es wichtig, Transaktionen in Szenarien mit hoher Auslastung so kurz wie möglich zu machen.

Es wird dringend empfohlen, dass sich die Anwendung immer im Kontext einer Transaktion befindet, wenn SIE ESE-APIs aufruft, die Daten abrufen oder aktualisieren. Wenn dies nicht der Fall ist, umschließt die Datenbank-Engine automatisch jeden ESE-API-Aufruf dieses Typs in einer Transaktion im Namen der Anwendung. Die Kosten dieser sehr kurzen Transaktionen können sich in einigen Fällen schnell summieren.

Das Standardverhalten der Engine besteht darin, die Verwendung einer Sitzung auf denselben Thread zu beschränken, ab dem Zeitpunkt, zu dem der erste Aufruf von JetBeginTransaction erfolgt, bis zu dem Zeitpunkt, zu dem der übereinstimmende Aufruf von JetCommitTransaction oder JetRollback erfolgt. Dieses Verhalten kann geändert werden, um diese Einschränkung durch Festlegen eines benutzerdefinierten Sitzungskontexts mithilfe von JetSetSessionContext und JetResetSessionContext zu entfernen.

Die Datenbank-Engine unterstützt auch Änderungen an Transaktionsschemas. Beispielsweise ist es möglich, eine neue Transaktion zu beginnen, eine Tabelle zu erstellen, ein paar Spalten hinzuzufügen, einen index oder zwei zu erstellen und die Transaktion dann abzubrechen. Die soeben hinzugefügten Schemaelemente werden aus der Datenbank entfernt. Es ist auch möglich, Schemaänderungen und gewöhnliche Datenbankupdates in derselben Transaktion zu kombinieren.

Anforderungen

Anforderung Wert

Client

Erfordert Windows Vista, Windows XP oder Windows 2000 Professional.

Server

Erfordert Windows Server 2008, Windows Server 2003 oder Windows 2000 Server.

Kopfzeile

Deklariert in Esent.h.

Bibliothek

Verwenden Sie ESENT.lib.

DLL

Erfordert ESENT.dll.

Weitere Informationen

JET_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
Systemparameter