Lade...
 

CX_TRANSACTION_MANAGER::SetDBMode

CX_TRANSACTION_MANAGER::SetDBMode

215529

Beschreibung:

Hiermit lässt sich der Systemweite Transaktionsmodus für eine einzelne Datenbank überschreiben. Dies führt dazu, dass während einer Transaktion einige Datenbanken im MVCC-Modus und einige im Update-Modus geöffnet sein können. Da dies beim Debuggen schwer nachvollziehbar sein kann, wird jeder Aufruf von SetDBMode cx.txn-Logger unter INFO geloggt und unter TRACE wird beim Transaktionsbeginn geloggt, welche Datenbank wieso in welchem Modus geöffnet wird.
Der Mauscursor zeigt eine Update-Transaktion an, wenn mindestens eine Datenbank zum Schreiben geöffnet ist, ansonsten wird eine Lesetransaktion angezeigt.

Achtung: Die angegebene Datenbank wird innerhalb dieses Aufrufs in dem entsprechenden Aufruf geöffnet.

Falls die Datenbank im KEEP_UPDATE oder WRITE-Modus geöffnet war und eine Schreibtransaktion offen hat und per SetDBMode in den READ_ONLY-Modus umgeschaltet werden soll, dann wird die aktuelle Transaktion abgebrochen, um die Datenbank neu zu öffnen.

Falls die Datenbank im READ_ONLY oder WRITE-Modus geöffnet war und eine Lesetransaktion offen hat und per SetDBMode in WRITE oder KEEP_UPDATE-Modus umgeschaltet werden soll, dann wird die aktuelle Transaktion beendet, um die Datenbank neu zu öffnen.

Nur falls keine Datenbank in einem anderen Modus geöffnet werden muss, bleibt die aktuell laufende Transaktion bestehen.


Als Modus sind folgende Angaben zulässig:

Modus Beschreibung
"WRITE" BeginTXN und BeginTXN(WRITE) öffnen die Datenbank im Schreibmodus.
BeginTXN(READ) öffnet die Datenbank trotzdem im MVCC-Modus.
"READ_ONLY"

BeginTXN und BeginTXN(READ) öffnen die Datenbank im MVCC-Modus.

Achtung: BeginTXN(WRITE) öffnet die Datenbank trotzdem im Schreibmodus.

"KEEP_UPDATE"

BeginTXN, BeginTXN(WRITE) & BeginTXN(READ) öffnen die Datenbank nur im 
Schreibmodus.
Hinweis: Hierdurch muss die Datenbank nie neu geöffnet werden und der Cache bleibt erhalten.

NULL

Setzt den Datenbankspezifischen Modus zurück. Damit gilt für die Datenbank wieder der systemweite Modus,
der per OpenDB gesetzt wird.

 

Das feingranulare Setzen der Datenbank-Modi ist eine Performance-Optimierung, der folgende Überlegungen zugrunde liegen:

  1. Der Moduswechsel einer Datenbank kostet besonders bei großen Datenbanken viel Zeit.
  2. Beim Moduswechsel einer Datenbank geht der Client-Cache für diese Datenbank verloren. Queries werden also wieder langsamer.
  3. Im MVCC-Modus kann eine Datenbank von beliebig vielen Clients gleichzeitig gelesen werden, ohne dass sie sich gegenseitig blockieren und auch nicht von schreibenden Clients blockiert werden. 
  4. Im MVCC-Modus können die Clients keine Daten beschreiben.
  5. Im Update-Modus kommt es bei vielen Clients häufig zu Locking-Konflikten, da eine Page nur von einem Client zur Zeit beschrieben werden darf und nur, wenn kein anderer Client diese Page liest.

 

Durch SetDBMode kann ein System wie folgt aufgebaut werden, um optimale Performance für alle Clients zu gewährleisten.

DB Modus Beschreibung
1 READ_ONLY Eine große Datenbank mit allen Unternehmensdaten, die feststehen, die sich selten ändern, aber häufig durchsucht werden müssen. Dies könnten Baupläne, Spezifikationen, Dokumentationen oder einfach archivierte Auftragsdaten sein.
Solange kein BeginTXN(WRITE) verwendet wird, bleibt diese Datenbank immer im MVCC-Modus geöffnet und kann dank bestehendem Cache von allen Clients schnell durchsucht werden. Ein Service-Job könnte diese Datenbank regelmäßig aktualisieren. Da nur der Service-Job die Datenbank zum Schreiben öffnet, gibt es auch hier keine Locking-Konflikte und die Updates gehen schnell.
2 KEEP_UPDATE Eine mittlere Datenbank mit zum Beispiel den Auftragsdaten des aktuellen Jahres. Diese Datenbank muss häufiger mal durchsucht und auch von den Mitarbeitern aktualisiert werden. KEEP_UPDATE sorgt dafür, dass der Client-Cache nicht verloren geht und dadurch die Suchabfragen schnell laufen (insofern die gesuchten Daten nicht aktuell beschrieben werden), was von der Frequenz abhängt mit der Daten beschrieben werden.
Sollte es zu längeren Wartezeiten durch Locking kommen, dann könnte der WRITE-Modus für diese Datenbank der bessere sein, denn dann würden Suchabfragen die Datenbank per BeginTXN(READ) in den MVCC-Modus schalten und damit zwar den Cache verwerfen, aber dafür würden sich schreibende und lesende Clients nicht mehr gegenseitig behindern und das System könnte trotzdem insgesamt schneller werden.
3 WRITE Eine kleine bis mittlere Datenbank mit sehr aktuellen Daten, in denen viel geschrieben wird. Für Suchabfragen wird die Datenbank per BeginTXN(READ) in den MVCC-Modus geschaltet und damit kommen sich lesende und schreibende Clients nicht in die Quere. Aufgrund der geringen Datenbankgröße ist der Moduswechsel schnell vollzogen und bremst den Ablauf nicht spürbar aus.

Wichtig: Voraussetzung für die hier vorgeschlagenen Konfiguration ist, dass im Code kein BeginTXN(WRITE) verwendet wird, da dies die erste Datenbank neu öffnen würde, was aufgrund der Größe eine gewisse Verzögerung bedeutet und zusätzlich den gesamten Client-Cache dieser Datenbank verwirft.

 

Code-Beispiel:
Var(db) GetManager(OBJECT) Call(GetDatabases) 0 Swap GetElement -> db db "KEEP_UPDATE" GetManager(TRANSACTION) Call(SetDBMode) // Set 1. db into KEEP_UPDATE mode 1 NULL GetManager(TRANSACTION) Call(SetDBMode) // Reset 1. db to default mode 2 "WRITE" GetManager(TRANSACTION) Call(SetDBMode) // Set 2. db to WRITE mode

 

Stack
Stack Position Objekttyp Kurzbeschreibung
Stack(In) Top CX_TRANSACTION_MANAGER Der Transaktionsmanager
  Top-1 STRING | NULL "READ_ONLY", "WRITE", "KEEP_UPDATE", NULL
  Top-2 DATABASE Die Datenbank
Stack(Out) Top - -
Funktionsaufruf: Call(SetDBMode)