CX_TRANSACTION_MANAGER::SetDefaultLockMode
215064
Beschreibung:
Diese Methode setzt den globalen Default-Lock-Modus für alle zukünftig gestarteten Transaktionen. Nach dem Systemstart entspricht der Default-Modus (UPGRADABLE,PAGE). Für jeden der beiden Parameter kann NULL (oder ein Leerstring) übergeben werden, um den Systemdefault zu verwenden.
Das Verändern des Lock-Modus kann man sich so vorstellen, dass bei jedem Transaktionsbeginn implizit ein BeginLock mit dem neu gesetzten Modus ausgeführt wird.
Wird in einer Anwendung der Lock-Modus auf (WRITE,DATABASE) gesetzt, dann werden alle Datenbankzugriffe aller Clients serialisiert und es kann immer nur ein Client zur Zeit auf die Datenbank zugreifen (Ausnahme: BeginTXN(READ)) und dieser blockiert alle anderen Clients solange seine Transaktion läuft. Auf diese (sehr ineffiziente) Weise lassen sich Deadlocks in Systemen mit chaotischen Datenzugriffen und wenigen Nutzern zuverlässig verhindern.
Hinweis: Der gesetzte Lock-Modus hat keinen Einfluss auf Datenbanken, die im MVCC-Modus geöffnet sind, da ein Write-Lock innerhalb eine MVCC-Datenbank zu einem Fehler führen würde und ohnehin keinen synchronisierenden Effekt hätte.
Das betrifft also Transaktionen, die mit BeginTXN(READ) geöffnet wurden und reguläre Transaktionen in Datenbanken, die per "READ_ONLY" GetManager(TRANSACTION) Call(OpenDB) geöffnet wurden.
Code-Beispiel:
// Prevent deadlocks entirely by locking the whole database for each db access "WRITE" "DATABASE" GetManager(TRANSACTION) Call(SetDefaultLockMode) //... // Restore default mode NULL NULL GetManager(TRANSACTION) Call(SetDefaultLockMode)
Stack | Position | Objekttyp | Kurzbeschreibung |
---|---|---|---|
Stack(In) | Top | CX_TRANSACTION_MANAGER | Der Transaktionsmanager |
Top-1 | STRING | NULL | Lock-Granularity: "PAGE" | "CLUSTER" | "SEGMENT" | "DATABASE" | |
Top-2 | STRING | NULL | Lock-Access: "READ" | "UPGRADABLE" | |
Stack(Out) | Top | - | - |