Lade...
 

CX_OBJECT_MANAGER::EnableDeadlockPrevention

CX_OBJECT_MANAGER::EnableDeadlockPrevention

214458
Beschreibung:

Um Deadlocks zwischen mehreren Clients zu verhindern, die durch die Verwendung von Upgradable-Locks entstehen, führt ClassiX in CreatePersObject vor dem Einfügen des Objekts in die REP und in TriggeredStateMonitor() vor dem Zugriff auf den Startzustand ein implizites BeginLock(WRITE) und nach Abschluss der Operation ein EndLock durchgeführt. Dadurch wird verhindert, dass sich mehrere Clients, die den gleichen Code gleichzeitig ausführen durch die Upgradable-Locks in diesen Aufrufen gegenseitig deadlocken können (insofern sie auf den gleichen Daten arbeiten). 

Den Locking-Modus für die Datenbank zu wechseln ist verhältnismäßig teuer und kann in Ladeläufen, die massiv persistente Objekte anlegen, ins Gewicht fallen und je nach Art der Laderoutine bis zu 25% der Ladezeit einnehmen (CreatePersObject wird etwa um den Faktor 4 langsamer). Da für die meisten Ladevorgänge nur ein Client die Datenbank öffen hält und befüllt und damit die Möglichkeit eines Deadlocks ohnehin ausgeschlossen ist, kann man für diese Fälle den Mechanismus deaktivieren, um so den Ladevorgang zu beschleunigen.

Im regulären Betrieb ist die hierdurch verursachte Verzögerung jedoch nicht messbar und der Mechanismus sollte grundsätzlich aktiviert bleiben, um Deadlocks verhindern zu können. Die Option ist nach dem Systemstart standardmäßig aktiviert.

 

Code-Beispiel:
FALSE GetManager(OBJECT) Call(EnableDeadlockPrevention)
do {
  ...
  CreatePersObject(...)
} while

 

Stack
Stack Position Objekttyp Kurzbeschreibung
Stack(In) Top CX_OBJECT_MANAGER  
  Top-1 INTEGER TRUE(1) = Aktiviert
FALSE(0) = Deaktiviert
Stack(Out) Top - -
Funktionsaufruf: Call(EnableDeadlockPrevention)