COM+-Verwaltungsvorgänge in Transaktionen
Die COM+-Registrierungsdatenbank (RegDB) ist ein transaktionsfähiger Ressourcen-Manager, der an COM+-Transaktionen teilnehmen kann. Auf diese Weise können Sie Verwaltungsvorgänge innerhalb einer Transaktion ausführen und alle Konfigurationsänderungen als atomischen Vorgang festlegen oder abbrechen lassen, auch auf mehreren Computern. Unter bestimmten Umständen kann es sehr vorteilhaft sein, dies zu tun, obwohl es Isolations- und Blockierungsverhalten gibt, die Sie berücksichtigen sollten, und die Durchführung von Verwaltungsaufgaben innerhalb von Transaktionen erfordert geringfügige Änderungen am normalen Verwaltungsprogrammmodell.
Vorteile von Verwaltungsvorgängen innerhalb von Transaktionen
- **Konsistenz der Daten –**Verwaltungsvorgänge, die innerhalb einer Transaktion ausgeführt werden, werden als Ganzes committet oder abgebrochen, obwohl es einige nicht transaktionale COM+-Katalogressourcen gibt, für die dies möglicherweise nicht der Fall ist. (Siehe unten nicht transaktionale COM+-Katalogressourcen.)
- **Konsistente Bereitstellung auf mehreren Computern– **Wenn Sie COM+-Anwendungen auf mehreren Servern bereitstellen, können Sie garantieren, dass alle Server identische Konfigurationen erhalten.
- **Skalierung und Leistung – **Wenn Sie mehrere Vorgänge innerhalb einer Transaktion ausführen, werden alle Schreibvorgänge in RegDB gleichzeitig ausgeführt. Persistente Schreibvorgänge in RegDB sind ein relativ teurer Vorgang. Wenn Sie viele Schreibvorgänge in RegDB vornehmen, können Sie einen großen Leistungsvorteil erzielen, wenn Sie sie alle gleichzeitig ausführen, anstatt jedes Mal, wenn Sie SaveChanges aufrufen.
Isolationsverhalten von RegDB
Um eine ordnungsgemäße Datenkonsistenz und serialisierbare Transaktionen sicherzustellen, erzwingt RegDB ein bestimmtes Blockierungs- und Isolationsverhalten, wenn Verwaltungsvorgänge innerhalb von Transaktionen ausgeführt werden.
Wenn eine Komponente, die innerhalb einer Transaktion arbeitet, eine Methode aufruft, die einen Schreibvorgang in den COM+-Katalog verursacht , z. B . SaveChanges, InstallApplication oder InstallComponent, wird für COM+-Katalogservercode eine Writersperre übernommen, die das Einkommen anderer Writer blockiert, bis die aktuelle Transaktion commits oder abgebrochen wird. Das heißt, Writer können nur kommen, wenn sie über die richtige Transaktionsaffinität verfügen und an der aktuellen Transaktion teilnehmen.
Leser werden nicht blockiert. Die Für Leser angezeigten Daten spiegeln jedoch keine zwischenzeitlichen Änderungen wider, die innerhalb der Transaktion vorgenommen wurden, bis die Transaktion tatsächlich committet wird. Alle Komponenten, die an dieser Transaktion teilnehmen, sehen beim Lesen von Daten Zwischendatenzustände, aber alle Komponenten außerhalb der Transaktion sehen diese Änderungen erst, nachdem die Transaktion abgeschlossen wurde.
SaveChanges-Verhalten
Um das oben beschriebene Isolationsverhalten zu erreichen, stellt RegDB effektiv einen Cache bereit, der von Komponenten innerhalb der Transaktion ausgeführt wird. Dadurch wird das Verhalten der SaveChanges-Methode geändert.
Normalerweise werden alle ausstehenden Änderungen ohne das Vorhandensein einer Transaktion in den Katalog geschrieben, wenn Sie SaveChanges aufrufen, und SaveChanges wird erst zurückgegeben, wenn alle Schreibvorgänge abgeschlossen sind. Dadurch wird sichergestellt, dass Sie startApplication aufrufen können, wenn ein Aufruf von SaveChanges erfolgreich zurückgegeben wird, und die Anwendung mit neuen Daten aktiviert wird.
Innerhalb einer Transaktion wirkt sich SaveChanges jedoch nur auf den Cache aus, nicht auf die RegDB selbst, und SaveChanges gibt sofort zurück, ob alle Änderungen transaktional an RegDB committet wurden. Es gibt keine Garantie, dass StartApplication nach der Rückgabe von SaveChanges neue Daten verwendet. Wenn Sie in diesem Kontext StartApplication aufrufen müssen, empfiehlt es sich, eine gewisse Zeit zu warten, bevor Sie dies tun.
Transaktion Time-Out Zeitraum
Wenn Sie zahlreiche Verwaltungsvorgänge innerhalb einer Transaktion durchführen, kann es sich um eine Transaktion mit langer Ausführungszeit handeln. In diesem Fall kann der Wert für das Transaktionstimeout ein Problem sein. Dies wird entweder durch den Transaktionstimeoutwert bestimmt, der für die Komponente festgelegt ist, die die Transaktion initiiert, oder durch die computerweite Timeouteinstellung für den Computer, auf dem diese Komponente ausgeführt wird. Wenn Sie zahlreiche Vorgänge innerhalb einer Transaktion ausführen, empfiehlt es sich, den entsprechenden Transaktionstimeoutzeitraum auf einen ausreichend langen Wert festzulegen und ggf. die ursprüngliche Einstellung wiederherzustellen, wenn Sie fertig sind.
Nicht transaktionale COM+-Katalogressourcen
Die Registrierung, das Dateisystem und Windows Installer (MSI) sind COM+-Katalogressourcen, die nicht transaktional sind.
Hinweis
Wenn ein Fehler auftritt, der eine Transaktion abbricht, wird für Änderungen an diesen Ressourcen möglicherweise kein Rollback ausgeführt.
Wenn beim Installieren einer vorhandenen COM+-Anwendung aus einer .msi-Datei ein Fehler auftritt, wird die Anwendung nicht im Snap-In Komponentendienste angezeigt, aber möglicherweise unter Programme hinzufügen/entfernen angezeigt. In diesem Fall müssen Sie sie manuell entfernen.
Wiederherstellung bei Systemstillstand
Wenn eine Komponente, die Verwaltungsvorgänge innerhalb einer Transaktion ausführt, hängen bleibt, während sie eine Writer-Sperre für den Katalogservercode enthält, würde sie alle anderen Daran hindern, Änderungen am Katalog vorzunehmen. In diesem Fall können Sie die Sperre für den Katalog löschen, indem Sie die Systemanwendung herunterfahren und neu starten.
Skripterstellung mit einem TransactionContext-Objekt
Eine einfache Möglichkeit, Verwaltungsvorgänge innerhalb von Transaktionen durchzuführen, ist die Verwendung eines TransactionContext-Objekts zum Steuern der Transaktion. Das folgende Visual Basic-Skript veranschaulicht beispielsweise, wie zwei neue Anwendungen transaktional hinzugefügt werden, sodass entweder beide Anwendungen oder keine anwendung erstellt wird:
Dim txctx
Dim cat
Dim apps
Dim app1
Dim app2
WScript.Echo "Starting"
Set txctx = CreateObject("TxCtx.TransactionContext")
Set cat = txctx.CreateInstance("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")
Set app1 = apps.Add
app1.Value("Name") = "Test App #1"
apps.SaveChanges
Set app2 = apps.Add
app2.Value("Name") = "Test App #2"
apps.SaveChanges
WScript.Echo "Ending"
txctx.Commit
Zugehörige Themen