COM+ Beheerbewerkingen binnen transacties
De COM+ registratiedatabase (RegDB) is een getransacteerde resourcemanager die kan deelnemen aan COM+-transacties. Hiermee kunt u beheerbewerkingen uitvoeren binnen een transactie en alle configuratiewijzigingen doorgevoerd of afgebroken als een atomische bewerking, zelfs op meerdere computers. In sommige omstandigheden kan het zeer nuttig zijn om dit te doen, hoewel er isolatie- en blokkeringsgedrag is dat u in aanmerking moet nemen, en het uitvoeren van beheertaken binnen transacties kleine wijzigingen in het normale beheerprogrammeringsmodel omvat.
Voordelen van het uitvoeren van beheerbewerkingen binnen transacties
- **Consistentie van gegevens: **Beheerbewerkingen die in een transactie worden uitgevoerd, worden als geheel doorgevoerd of afgebroken, hoewel er enkele niet-transactionele COM+ catalogusresources zijn waarvoor dit mogelijk niet het geval is. (Zie niet-transactionele COM+ catalogusbronnen hieronder.)
- **Consistente implementatie op meerdere computers: **Als u COM+-toepassingen op meerdere servers implementeert, kunt u garanderen dat alle servers identieke configuraties hebben.
- **Schalen en prestaties: **Wanneer u meerdere bewerkingen binnen een transactie uitvoert, worden alle schrijfbewerkingen naar RegDB in één keer uitgevoerd. Persistente schrijfbewerkingen naar RegDB zijn een relatief dure bewerking; Als u veel schrijfbewerkingen naar RegDB maakt, kunt u profiteren van een groot prestatievoordeel door ze allemaal tegelijk uit te voeren in plaats van telkens wanneer u SaveChangesaanroept.
Isolatiegedrag van RegDB
RegDB dwingt bepaalde blokkerings- en isolatiegedrag af wanneer beheerbewerkingen binnen transacties worden uitgevoerd om de juiste gegevensconsistentie en serializable transacties te garanderen.
Wanneer een onderdeel dat binnen een transactie werkt, een methode aanroept die een schrijfbewerking naar de COM+-catalogus veroorzaakt, zoals SaveChanges, InstallApplicationof InstallComponent, wordt een schrijfvergrendeling uitgevoerd op COM+-catalogusservercode die blokkeert dat andere schrijvers binnenkomen totdat de huidige transactie doorvoert of wordt afgebroken. Dat wil gezegd, kunnen schrijvers alleen binnenkomen als ze de juiste transactieaffiniteit hebben en deelnemen aan de huidige transactie.
Lezers worden niet geblokkeerd. De gegevens die lezers zien, weerspiegelen echter geen tussentijdse wijzigingen die in de transactie zijn aangebracht totdat die transactie daadwerkelijk is doorgevoerd. Alle onderdelen die aan die transactie deelnemen, zien tussentijdse gegevensstatussen wanneer ze gegevens lezen, maar alle onderdelen buiten de transactie zien die wijzigingen pas nadat de transactie is voltooid.
SaveChanges-gedrag
Om het hierboven beschreven isolatiegedrag te bereiken, biedt RegDB effectief een cache waarop wordt gereageerd door onderdelen binnen de transactie. Hiermee wordt het gedrag van de methode SaveChanges gewijzigd.
Normaal gesproken worden alle wijzigingen die in behandeling zijn, zonder de aanwezigheid van een transactie naar de catalogus geschreven wanneer u SaveChangesaanroept en SaveChanges pas wordt geretourneerd als alle schrijfbewerkingen zijn voltooid. Dit garandeert dat als een aanroep naar SaveChanges correct wordt geretourneerd, u StartApplication- kunt aanroepen en de toepassing met nieuwe gegevens activeert.
Binnen een transactie is SaveChanges- echter alleen van invloed op de cache, niet de RegDB zelf, en SaveChanges retourneert onmiddellijk of alle wijzigingen transactioneel zijn doorgevoerd in RegDB. Er is geen garantie dat StartApplication- nieuwe gegevens gebruikt na SaveChanges retourneren. Als u StartApplication- in deze context moet aanroepen, is het raadzaam om enige tijd te wachten voordat u dit doet.
Transactie Time-Out periode
Als u talloze beheerbewerkingen binnen een transactie uitvoert, kan dit een langdurige transactie zijn. In dit geval kan de time-outwaarde van de transactie een probleem zijn. Dit wordt bepaald door de time-outwaarde van de transactie die is ingesteld voor het onderdeel dat de transactie initieert of door de time-outinstelling voor de machine waarop dat onderdeel wordt uitgevoerd. Als u talloze bewerkingen binnen een transactie uitvoert, is het raadzaam om de juiste time-outperiode voor transacties in te stellen op een voldoende lange waarde en, indien nodig, om de oorspronkelijke instelling te herstellen wanneer u klaar bent.
Niet-transactionele COM+-catalogusbronnen
Het register, het bestandssysteem en Windows Installer (MSI) zijn COM+-catalogusbronnen die niet transactioneel zijn.
Notitie
Als er een fout optreedt waardoor een transactie wordt afgebroken, worden wijzigingen in deze resources mogelijk niet teruggedraaid.
Als er een fout optreedt tijdens het installeren van een bestaande COM+-toepassing uit een .msi-bestand, wordt de toepassing niet weergegeven in de module Component Services, maar wordt deze mogelijk weergegeven in programma's voor toevoegen/verwijderen. In dat geval moet u deze handmatig verwijderen.
Herstellen in het geval van systeemhangen
Als een onderdeel dat beheerbewerkingen binnen een transactie uitvoert, vastloopt terwijl het een schrijfvergrendeling op de catalogusservercode bevat, kan iedereen anders geen wijzigingen aanbrengen in de catalogus. Als dit gebeurt, kunt u de vergrendeling van de catalogus wissen door de systeemtoepassing af te sluiten en opnieuw op te starten.
Scripts uitvoeren met een TransactionContext-object
Een eenvoudige manier om beheerbewerkingen binnen transacties uit te voeren, is door een TransactionContext--object te gebruiken om de transactie te beheren. Het volgende Visual Basic-script laat bijvoorbeeld zien hoe u transactioneel twee nieuwe toepassingen toevoegt, zodat beide toepassingen of geen van beide toepassingen worden gemaakt:
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
Verwante onderwerpen