JetEscrowUpdate-Funktion

Gilt für: Windows | Windows Server

JetEscrowUpdate-Funktion

Die JetEscrowUpdate-Funktion führt einen Atomaren Additionsvorgang für eine Spalte aus. Diese Funktion ermöglicht es mehreren Sitzungen, denselben Datensatz gleichzeitig ohne Konflikte zu aktualisieren.

    JET_ERR JET_API JetEscrowUpdate(
      __in          JET_SESID sesid,
      __in          JET_TABLEID tableid,
      __in          JET_COLUMNID columnid,
      __in          void* pv,
      __in          unsigned long cbMax,
      __out_opt     void* pvOld,
      __in          unsigned long cbOldMax,
      __out_opt     unsigned long* pcbOldActual,
      __in          JET_GRBIT grbit
    );

Parameter

sesid

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

tableid

Der Cursor, der für diesen Aufruf verwendet werden soll.

Columnid

Die Columnid der zu aktualisierenden Spalte.

pv

Ein Zeiger auf einen Puffer, der den Addend für die Spalte enthält.

cbMax

Die Größe des Puffers, der den Addend enthält.

pvOld

Der Ausgabepuffer, der den aktuellen Wert der Spalte empfängt, wie er in der Datenbank gespeichert ist (Versionsverwaltung wird ignoriert).

cbOldMax

Die maximale Größe des Ausgabepuffers, der den aktuellen Wert der Spalte empfängt. Derzeit wird nur JET_coltypLong unterstützt, sodass der Puffer entweder 4 Bytes oder 0 Bytes lang sein muss. Wenn pvOld NULL ist, sollte cbOldMax 0 sein.

pcbOldActual

Empfängt die tatsächliche Menge an Rohdaten, die im Ausgabepuffer empfangen werden.

grbit

Eine Gruppe von Bits, die null oder mehr der folgenden Optionen angibt.

Wert

Bedeutung

JET_bitEscrowNoRollback

Auch wenn für die Sitzung, in der das Escrow-Update ausgeführt wird, ein Transaktionsrollback ausgeführt wird, wird dieses Update nicht rückgängiggemacht. Beachten Sie, dass die zuletzt mit diesem Flag durchgeführten Escrow-Updates möglicherweise verloren gehen, wenn es zu einem Absturz kommt, da die Protokolldatensätze möglicherweise nicht auf den Datenträger geleert werden.

Rückgabewert

Diese Funktion gibt den JET_ERR-Datentyp 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_errAlreadyPrepared

Für den Cursor ist ein Update mit JetPrepareUpdate vorbereitet.

JET_errClientRequestToStopJetService

Es ist nicht möglich, den Vorgang abzuschließen, da alle Aktivitäten auf dem 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 beim instance, der 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 höheren Versionen zurückgegeben.

JET_errInvalidBufferSize

Eine ungültige Puffergröße wurde übergeben. Derzeit wird nur JET_coltypLong unterstützt, sodass der Puffer 4 Bytes betragen muss.

JET_errInvalidOperation

Es wurde eine ungültige Spalte angegeben. Die Spalte muss mit JET_bitColumnEscrowUpdate angegeben werden. Nur feste Spalten von JET_coltypLong können als Escrow-Aktualisierung angegeben werden.

JET_errNoCurrentRecord

Der Cursor muss sich in einem Datensatz befinden, um eine Spalte zu aktualisieren.

JET_errNotInTransaction

Escrow-Updates können nur von Sitzungen in einer Transaktion ausgeführt werden.

JET_errNotInitialized

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

JET_errPermissionDenied

Der Cursor kann nicht schreibgeschützt sein und einen Datensatz aktualisieren.

JET_errRestoreInProgress

Es ist nicht möglich, den Vorgang abzuschließen, da auf dem der Sitzung zugeordneten instance ein Wiederherstellungsvorgang ausgeführt wird.

JET_errSessionSharingViolation

Dieselbe Sitzung kann nicht von mehreren Threads gleichzeitig verwendet werden. Dieser Fehler wird nur von Windows XP und höheren Versionen zurückgegeben.

JET_errTermInProgress

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

JET_errTransReadOnly

Sitzung muss über Schreibberechtigungen verfügen, um einen Datensatz zu aktualisieren.

JET_errWriteConflict

Der Fehler, der zurückgegeben wird, wenn ein in Konflikt stehendes Update angefordert wird.

Bemerkungen

Wenn zwei Sitzungen versuchen, einen Datensatz gleichzeitig zu aktualisieren, erhält die zweite Sitzung normalerweise einen JET_errWriteConflict Fehler, es sei denn, die Sitzungen sind vollständig serialisiert. Um zwei Sitzungen zu serialisieren, die denselben Datensatz aktualisieren, muss die zweite Sitzung ihre Transaktion starten, nachdem die erste Transaktion ihre Transaktion committen hat. Weitere Informationen finden Sie unter JetBeginTransaction .

Escrow kann mehrere Spalten im selben Datensatz aktualisieren. Die Updates wirken sich nicht gegenseitig aus.

Nur JetEscrowUpdate-Vorgänge sind miteinander kompatibel. Wenn zwei verschiedene Sitzungen versuchen, Updates vorzubereiten oder denselben Datensatz zu löschen, wird ein Schreibkonflikt generiert.

Sitzung B
JetEscrowUpdate

JetPrepareUpdate

JetDelete

JetEscrowUpdate

JET_errSuccess

JET_errWriteConflict

JET_errWriteConflict

JetUpdate

JET_errWriteConflict

JET_errWriteConflict

JET_errWriteConflict

Sitzung A

JetDelete

JET_errWriteConflict

JET_errWriteConflict

JET_errWriteConflict

Escrow-Vorgänge werden versioniert und mithilfe von JetRollback rückgängiggemacht (es sei denn, es wurde JET_bitEscrowNoRollback angegeben). JetEscrowUpdate gibt den Rohwert der in der Datenbank gespeicherten Spalte zurück, da eine Anwendung möglicherweise eine spezielle Aktion ausführen möchte, wenn ein Sentinelwert erreicht wird. JetRetrieveColumn gibt die korrekt versionierte Ansicht der Spalte zurück, wobei Updates von gleichzeitigen Sitzungen ignoriert werden.

Wenn zwei Sitzungen in derselben Spalte desselben Datensatzes ausgeführt werden, können wir sehen, wie dies funktioniert. Angenommen, die Spalte beginnt mit dem Wert 0.

Sitzung

Vorgang

Gespeicherter Wert

Rückgabewert

A

JetBeginTransation

A

JetBeginTransation

0

A

JetEscrowUpdate (4)

4

0

A

JetRetrieveColumn

4

B

JetBeginTransaction

B

JetRetrieveColumn

0

B

JetEscrowUpdate (3)

7

4

B

JetRetrieveColumn

3

A

JetEscrowUpdate (2)

9

7

A

JetEscrowUpdate (-7)

2

9

B

JetRetrieveColumn

3

A

JetRetrieveColumn

-1

B

JetRollback

-1

A

JetRetrieveColumn

-1

Das Ersetzen eines Datensatzes in derselben Transaktion, die Treuhandupdates für einen Datensatz ausführt, wird nicht empfohlen. Insbesondere, wenn ein Update für einen Datensatz mit einer JET_TABLEID vorbereitet wird und ein anderer JET_TABLEID verwendet wird, um den Datensatz zu aktualisieren, geht der aktualisierte Escrow verloren, wenn JetUpdate aufgerufen wird. Dies geschieht auch dann, wenn die Escrow-Spalte während des Updates nicht festgelegt wurde.

Wenn eine aktualisierbare Escrow-Spalte den Wert 0 aufweist, kann ein spezielles Verhalten ausgelöst werden. Dieses Verhalten tritt nur auf, wenn ein JetEscrowUpdate-Vorgang bewirkt, dass die Spalte den Wert 0 aufweist. Die Aktion erfolgt nicht sofort, sondern tritt irgendwann nach der Transaktion auf, wodurch die Spalte einen Wert von null Commits aufweist. Die Spalte muss weiterhin den Wert 0 aufweisen (d. a. wenn die Spalte von keiner anderen Sitzung geändert wurde). Wenn die Spalte mit JET_bitColumnDeleteOnZero erstellt wurde, wird der Datensatz, der die Spalte enthält, gelöscht. Wenn die Spalte mit JET_bitColumnFinalize erstellt wurde, wird ein Rückruf ausgegeben. Ein Absturz kann dazu führen, dass diese Aktionen nicht auftreten, aber die Onlinewartung (mithilfe der JetDefragment-Funktion ) wiederholt die Aktionen ordnungsgemäß.

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_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetBeginTransaction
JetDefragmentierung
JetPrepareUpdate
JetRetrieveColumn
JetRollback
JetStopService
JetUpdate