ObjectContext-Objekt  

Ab Version 2.0 gehört zu den wichtigen Funktionen von ASP (Windows Active Server Pages) die Erstellung von Transaktionsskripts. Hierbei handelt es sich um Skripts, deren Codesegmente entweder alle erfolgreich sind oder als Gruppe fehlschlagen. Beim Einsatz eines solchen Skripts entfernt ein Codeabschnitt beispielsweise einen Datensatz aus einer Inventartabelle, und ein zweiter Abschnitt fügt der Vertriebsprotokolltabelle einen Datensatz hinzu. Das Skript ist jedoch nur insgesamt erfolgreich, wenn beide Codeabschnitte erfolgreich ausgeführt werden. D. h., wenn der Inventardatensatz nicht entfernt bzw. der Vertriebsdatensatz nicht hinzugefügt werden kann, schlägt das Skript fehl. Beide Prozesse werden in diesem Fall rückgängig gemacht: Der evtl. gelöschte Inventardatensatz wird erneut in die Datenbank eingefügt, und der ggf. hinzugefügte Vertriebsdatensatz wird wieder aus der Protokolltabelle gelöscht. Die Möglichkeit, mehrere Funktionen in einer Transaktionseinheit zusammenzufuassen, die als Ganzes erfolgreich ist bzw. fehlschlägt, ist eine bedeutende Verbesserung der Leistung von ASP-Anwendungen. Zuvor mussten alle Transaktionen von Datenbanktransaktionen unterstützt werden.

ASP-Anwendungstransaktionen werden über Windows 2000 COM+ Component Services bzw. Microsoft Transaction Server (MTS, für Windows NT) gesteuert. Dieser Teil der BackOffice-Suite ermöglicht Ihnen die Steuerung aller Datenbankaktionen, die entsprechend kodiert sind. Die Unterstützung für Transaktionsskripts ist in IIS und Personal Web Server (PWS) integriert und erfordert keinen speziellen Setup. Ohne COM+ Component Services bzw. MTS-Transaktionsunterstützung (in ASP 2.0) müssten Ihre Anwendungen alle Datenbankänderungen manuell verfolgen und rückgängig machen und dabei den Zugriff von mehreren Benutzern und Zugangskonflikte usw. verfolgen. MTS bzw. COM+ Component Services bietet diese Unterstützung für einen nur geringfügig höheren Kodierungsaufwand, so lange Ihre Anwendung mit der Datenbank Microsoft SQL Server verbunden ist bzw. das XA-Protokoll des X/Open-Konsortiums unterstützt. Beachten Sie jedoch, dass Dateiaktionen noch nicht (bzw. nicht automatisch) unterstützt werden.

Die Unterstützung von Transaktionen in ASP ist durch die Verwendung des Objekts ObjectContext kodiert, das das eigentliche Objekt ObjectContext von COM+ Component Services repräsentiert. Durch Aufrufen der Methoden des Objekts ObjectContext und Kodieren der zugehörigen Ereignisse können Sie ein Transaktionsskript mit nur einigen Zeilen mehr Code erstellen.

Um das gesamte Skript auf einer bestimmten Seite als Transaktionsskript zu deklarieren, fügen Sie dem Skript einfach die folgende Codezeile als erste Zeile hinzu.

<%@ TRANSACTION = Required %>

Weitere Informationen zur ASP-Direktive TRANSACTION finden Sie in Kapitel 11. An dieser Stelle ist nur wichtig, dass diese Zeile an erster Stelle im Skript stehen muss. Die Zeile sorgt dafür, dass der Webserver die Component Services verwendet, damit das Skript als Ganzes erfolgreich ist bzw. fehlschlägt.

Damit die Transaktion wirksam wird bzw. um sie abzubrechen, rufen Sie einfach die Methode SetComplete bzw. SetAbort des ObjectContext-Objekts auf. Wenn es sich um eine komplexe Transaktion mit Codesegmenten handelt, die nicht von Component Services unterstützt werden (namentlich Dateiaktionen), können Sie diese Aktionen in den ObjectContext-Ereignissen OnTransactionCommit und OnTransactionAbort gesondert kodieren. Beispiele zu diesen Methoden und Ereignisprozeduren finden Sie im Referenzabschnitt weiter unten in diesem Kapitel.

Anmerkungen/Fehlerbehebung  
 
 

Zurzeit bestehen zwei äußerst wichtige Einschränkungen bei der Erstellung von Transaktionsskripts:

    Es werden ausschließlich Datenbankaktionen unterstützt. Zusätzlich werden nur SQL-Server und -Datenbanken, die das XA-Protokoll unterstützen, von COM+ Component Services bzw. MTS unterstützt.

    Eine Transaktion kann nicht mehr als eine ASP-Seite umfassen. Aus diesem Grund müssen Sie Ihre Seiten sehr sorgsam erstellen, damit sie alle Aktionen enthalten, die für Ihre Transaktionen erforderlich sind. Dabei dürfen sie jedoch nicht so groß sein, dass die Verarbeitung der Seite stark verlangsamt wird.

Wenn Sie Ihre eigenen Serverkomponenten schreiben, um einige oder alle Datenbankaktionen in Ihrer Transaktion zu vervollständigen, muss diese Komponente in einem MTS-Paket registriert sein. (MTS-Transaktionsunterstützung ist nur gegeben, wenn eine Komponente registriert ist. Darüber hinaus sollten Sie Ihre eigenen Bibliothekspakete erstellen und Ihre Komponenten nicht in das prozessinterne IIS-Paket aufnehmen. Benutzerdefinierte Bibliothekspakete können von mehreren ASP-Anwendungen verwendet werden und werden im gleichen Prozess wie die ASP-DLL ausgeführt. Die Einrichtung von Bibliothekspaketen bewirkt auch, dass Ihre Komponente zur Wiederverwendung durch Ihre Anwendungen gepoolt werden kann. Dieses Pooling wird ebenfalls von MTS verwaltet. Sie können Ihre Komponenten auch einem Serverpaket hinzufügen. Dies ist jedoch nur für aufgabenbasierte Transaktionen erforderlich bzw. für Transaktionen, die auf Remote-Computern ausgeführt werden.)

Weitere Informationen zum Objekt ObjectContext und zu Serverkomponenten siehe auch Developing ASP Components von Shelley Powers, veröffentlicht von O'Reilly.

Objekten mit Transaktionssitzungs- oder anwendungsweiter Gültigkeit sollten Sie keine Funktion zuweisen, da Transaktionsobjekte nach ihrem Abschluss deaktiviert werden. Wenn Sie einem solchen Objekt Sitzungs- oder Anwendungsgültigkeit geben, schlagen Aufrufe nach Abschluss der Transaktion fehl und erzeugen einen Fehler.

Obwohl Transaktionen nur für Datenbankaktionen unterstützt werden, können Sie den Ereignisprozeduren OnTransactionCommit und OnTransactionAbort Code hinzufügen, um Ihre eigene, nicht datenbankbasierte Transaktionsunterstützung zu gewähren. Code in diesen Ereignisprozeduren könnte zum Beispiel zum Schreiben oder Löschen von Dateien nach erfolgreicher oder fehlgeschlagener Ausführung einer bestimmten Transaktion aus dem Dateisystem verwendet werden.

ObjectContext stellt über die Methoden, auf die Sie über ASP Zugriff haben, noch sechs weitere Methoden bereit. Auf diese kann jedoch nur mit Hilfe von Code in den Serverkomponenten zugegriffen werden, die über COM+ Component Services bzw. MTS verwaltet werden. Diese werden hier nicht näher erläutert.

Transaktionsskripts sind eine äußerst wichtige Hinzufügung zu ASP. Selbst wenn Sie ausschließlich über den Einsatz von ActiveX-Datenobjekten Zugriff auf Datenbanktransaktionen hätten, wäre dies eine äußerst wichtige und nützliche Funktion. Durch die Erstellung von benutzerdefinierten Serverkomponenten können Sie jedoch komplexe und leistungsstarke Transaktionen erstellen.

SetAbort  
ObjectContext.SetAbort
 

Bricht eine Transaktion als Ganzes ab. Beim Aufruf dieses Befehls wird die Transaktion nicht erfolgreich beendet, unabhängig davon, ob Code in Ihrem Skript bereits ausgeführt wurde.

Sie können diese Methode in Ihrem Skript einsetzen, nachdem Sie den Abschluss eines bestimmten Teils der Transaktion getestet haben oder eine von MTS bzw. COM+ Component Services verwaltete Serverkomponente sie aufrufen kann. Durch den Aufruf von SetAbort stellen Sie die Teile einer Transaktion wieder her, die ggf. bereits aufgetreten sind. Darüber hinaus wird die Ereignisprozedur ObjectContext_OnTransactionAbort aufgerufen, wenn diese in Ihrem Skript vorhanden ist.

 
Parameter

Keine

 
Beispiel
<%

' The following code tests the result from a method call
' to a custom server component that attempts to remove
' a book from the inventory table and then tests the
' results from a credit card check.

' Based on this code and the segment that follows it, the 
' script will call either the SetAbort or the SetComplete 
' method of the ObjectContext object.

' Attempt to sell 2 copies of the book Animal Farm.
intBooks = MyInventory.SellBook("Animal Farm", 2)

' Check the credit card given by the client.
intCheckCC = MyCreditChecker.ChkCard("0001231234")

If intBooks = 2 And intCheckCC = 0 Then

   ' Complete the transaction. Two copies of the book 
   ' are in the inventory and the credit card checks out.
   ObjectContext.SetComplete

Else

   ' Abort the transaction. Either there are not two 
   ' copies of the book in the inventory or the credit 
   ' card did not check out.
   ObjectContext.SetAbort

End If

%>
 
Hinweise

Alle Segmente in einem Transaktionsskript können die Methode SetAbort aufrufen. Beachten Sie jedoch, dass Code, der nach dem Aufruf von SetAbort vorhanden ist, erst nach der Ereignisprozedur OnTransactionAbort ausgeführt wird, wenn diese existiert. Aus diesem Grund sollten Sie sicherstellen, dass Ihre Ereignisprozedur OnTransactionAbort alle Optimierungsschritte ausführt, die für Aktionen erforderlich ist, die nicht durch eine Transaktion unterstützt werden (namentlich Dateiaktionen).

Wenn bestimmter Code unabhängig vom Aufruf SetAbort verarbeitet werden soll, müssen Sie diesen im Skript vor dem Aufruf SetAbort platzieren oder den Abschluss der Transaktion nach Ihrem Code im Skript testen.

 
SetComplete  
ObjectContext.SetComplete
 

Gibt den erfolgreichen Abschluss einer Transaktion an. Wenn diese Methode aufgerufen wird, wird der Code in der Ereignisprozedur OnTransactionCommit verarbeitet, wenn dieser vorhanden ist.

Der Aufruf der Methode SetComplete direkt aus dem Skript selbst weist auf den erfolgreichen Abschluss des Skripts auf der Seite hin. Diese Methode überschreibt jedoch nicht das mögliche Fehlschlagen des Codes innerhalb der Komponenten, auf die das Skript Bezug nimmt. Alle Transaktionskomponenten im Skript müssen SetComplete angeben, damit die Transaktion wirksam wird.

 
Parameter

Keine

 
Beispiel

Siehe das Beispiel im Abschnitt oben unter "SetAbort".

 
Hinweise

Beachten Sie, dass der Aufruf von SetComplete nicht unbedingt bedeutet, dass die gesamte Transaktion abgeschlossen ist. Jede Komponente, die durch das Skript aufgerufen wird, muss ebenfalls die Methode SetComplete des ObjectContext-Objekts aufrufen.

Wenn Sie SetComplete nicht explizit aufrufen, ist die Transaktion erst abgeschlossen, nachdem der gesamte Code ohne Aufruf von SetAbort verarbeitet ist. Wenn SetAbort bis zum Ende des Skripts nicht aufgerufen wird, wird die Ereignisprozedur OnTransactionCommit (falls vorhanden) verarbeitet, unabhängig davon, ob SetComplete aufgerufen wird.

 
OnTransactionAbort  
OnTransactionAbort( )
 

Die Ereignisprozedur OnTransactionAbort wird umgehend verarbeitet, wenn die Methode SetAbort des ObjectContext-Objekts explizit im Skriptcode oder durch eine Serverkomponente vom Skriptcode aufgerufen wird. Ruft kein Code die Methode SetAbort auf, wird diese Ereignisprozedur nie verarbeitet.

 
Parameter

Keine

 
Beispiel
<% 

' The following code procedure is processed when the code in 
' the SetAbort method example is processed.
Sub OnTransactionAbort ( )
%>
   Your book sales transaction could not be completed.
   Either there was not sufficient inventory for your
   sale to be processed, or your credit card did not 
   go through.
<%
   ' Clean up any nontransactional actions here...

End Sub

%>
 
Hinweise

Verwenden Sie die Methode OnTransactionAbort, um nicht unterstützte Aktionen Ihrer Transaktion zu optimieren, die rückgängig gemacht werden müssen, falls die Transaktion fehlschlägt. Dies schließt Änderungen an Variablen (mit sitzungs- bzw. anwendungsweiter Gültigkeit), der Registrierung und am Dateisystem ein. Sie sollten jedoch darauf achten, dass Ihre Serverkomponenten nach Abschluss einer Aktion "aufräumen".

Das Ereignis OnTransactionAbort wird auch dazu verwendet, den Client über das Fehlschlagen der Transaktion zu informieren.

Rufen Sie die Methoden SetAbort und SetCommit nicht aus der Ereignisprozedur OnTransactionAbort auf. Dies könnte eine Schleife einfügen und dazu führen, das die Funktionalität Ihrer Anwendung und/oder Daten verloren gehen.

 
OnTransactionCommit  
OnTransactionCommit( )
 

Die Ereignisprozedur OnTransactionCommit wird umgehend verarbeitet, wenn die Methode SetCompletedes ObjectContext-Objekts explizit im Skriptcode oder durch eine Serverkomponente vom Skriptcode aufgerufen wird. Sie wird implizit aufgerufen, wenn kein Skript auf der aktuellen Seite die Methode SetAbort aufgerufen hat.

 
Parameter

Keine

 
Beispiel
<% 

' The following code procedure is processed when the code in 
' the SetComplete method example is processed.
Sub OnTransactionCommit ( )
%>
   Your book sales transaction was completed.
   Thank you for your sale.

<%
   Session("intTotalSales") = Session("intTotalSales") + 1

   ' Process any nontransactional code here...

End Sub

%>
 
Hinweise

Die Ereignisprozedur OnTransactionCommit kann dazu eingesetzt werden, den Client über den Erfolg der Transaktion zu informieren. Sie kann auch für Code verwendet werden, der nur ausgeführt werden soll, nachdem eine Transaktion erfolgreich abgeschlossen wurde.

Rufen Sie die Methoden SetAbort und SetCommit nicht aus der Ereignisprozedur OnTransactionCommit auf. Dies könnte eine Schleife einfügen und dazu führen, das die Funktionalität Ihrer Anwendung und/oder Daten verloren gehen.