Verwenden von Transaktionen mit SOAP-Sitzungen
Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.
Eine Transaktion besteht häufig aus einer Reihe von Batches, die nacheinander abgesendet werden und die eine bestimmte Ausführungsreihenfolge erfordern. Wenn einer der Batches in der Transaktion nicht abgeschlossen wird, kann für die gesamte Transaktion ein Rollback ausgeführt werden. Dadurch werden die Änderungen rückgängig gemacht, die im Rahmen der Transaktion von früheren Batches durchgeführt wurden, und die betroffenen Daten werden in ihren vorherigen Status zurückversetzt.
Beim traditionellen SQL-Datenzugriff hängt die zugrunde liegende Netzwerkverbindung davon ab, dass bei der Verarbeitung und Ausführung in einer Transaktion mit mehreren Batches alle Batches der Transaktion verarbeitet werden. Betrachten Sie z. B. die folgenden Ausführungen als ein Beispiel für die Beziehung zwischen einer SQL Server-Verbindung und drei unterschiedlichen Transaktionen:
SQL connection(1)
--> SQL batch(1)
--> transaction(1)
--> SQL batch(2)
--> transaction(2a)
--> SQL batch(3)
--> transaction(2b), transaction(3)
Beachten Sie, dass die Transaktionen (1) und (3) innerhalb desselben Batches ausgeführt werden, enthalten sind und durch ein Commit bestätigt werden. Dagegen erstreckt sich die Transaktion (2) über die Batches (2) und (3). Die zugrunde liegende Verbindung bietet den Kontext, um sicherzustellen, dass die Transaktion alle Batches in der erforderlichen Reihenfolge ausführt. Beim HTTP-SOAP-Zugriff kann die Transaktionsverarbeitung nicht durchgeführt werden, wenn vom Kontext einer einzelnen zugrunde liegenden Netzwerkverbindung ausgegangen wird. Daher dient eine einzelne SOAP-Sitzung demselben Zweck, um die Verarbeitung von Transaktionen mit mehreren Batches zu unterstützen. Der folgende Code zeigt z. B., wie dasselbe Muster von Batches und Transaktionen beim HTTP-SOAP-Zugriff ausgeführt werden könnte.
SOAP session(1)
--> SQL batch(1)
--> transaction(1)
--> SQL batch(2)
--> transaction(2a)
--> SQL batch(3)
--> transaction(2b), transaction(3)
Solange dieselbe SOAP-Sitzung (1) aktiv bleibt, kann jeder Batch in separaten Meldungspaaren aus SOAP-Anforderungen und -Antworten ausgeführt werden, indem sie als der zugrunde liegende Kontext verwendet wird.
Verwalten SOAP-basierter Transaktionen durch SQL Server
SQL-Transaktionen werden auf der Instanz von SQL Server initiiert, wenn eine Änderung des Transaktionsstatus erfolgt. Dies kann durch jedes der folgenden Ereignisse verursacht werden, die auftreten, weil der Server eine SOAP-Anforderung von einem Client verarbeitet.
Beginn der Transaktion
Commit der Transaktion
Rollback der Transaktion
DTC-Eintragung für Transaktion
DTC-Austritt aus Transaktion
Standardmäßig wird der Server im autocommit transaction-Modus betrieben. Bei diesem Verhalten wird von einem relativ einfachen Eins-zu-eins- und Batch-zu-Transaktionsverhältnis ausgegangen, und es werden keinerlei Transaktionsinformationen (Header, Deskriptoren) zum Client zurückgegeben.
Der Autocommit-Transaktionsmodus könnte für die Transaktionen (1) und (3) im vorigen Beispiel ausreichend sein. Allerdings war für die Transaktion (2) aus diesem Beispiel mehrere Batches erforderlich, weshalb ein manuelles Verwalten der Transaktion erforderlich wäre.
Manuelles Verwalten von Transaktionen
Zum manuellen Verwalten des Commits oder des Rollbacks für die Transaktion muss der SOAP-Client die sqloptions:environmentChangeNotification-Option festlegen, bevor die SOAP-Sitzung initialisiert wird, und innerhalb dieses Headers den Wert seines transactionBoundary-Attributs auf true festlegen, wie das im folgenden Beispiel für eine SOAP-Anforderungsnachricht gezeigt wird:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
xmlns:sql="https://schemas.microsoft.com/sqlserver/2004/SOAP"
xmlns:xsi="http://www.w3.org/2004/XMLSchema-instance"
xmlns:sqlparam="https://schemas.microsoft.com/sqlserver/2004/sqltypes/SqlParameter"
xmlns:sqlsoaptypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes"
xmlns:sqloptions="https://schemas.microsoft.com/sqlserver/2004/SOAP/Options">
<SOAP-ENV:Header>
<sqloptions:environmentChangeNotifications transactionBoundary="true" />
<sqloptions:sqlSession initiate="true" timeout="60"/>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<sql:sqlbatch>
<sql:BatchCommands>
USE master
BEGIN TRANSACTION
CREATE TABLE session_table (col1 int);
</sql:BatchCommands>
</sql:sqlbatch>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Damit wird der Server angewiesen, für die aktuelle Sitzung den Autocommit-Transaktionsmodus zu deaktivieren. Der Server sendet dann eine SOAP-Antwort ähnlich der folgenden, in der die Sitzung identifiziert (jGqn3/X73EGHjFxZ12zovw==) und ein SqlTransaction-Wert zum Bestätigen eines BEGIN TRANSACTION-Ereignisses auf dem Server sowie einen Transaktionsdeskriptor (AQAAADMAAAA=) zurückgibt, die der Client in nachfolgenden SOAP-Anforderungen im Rahmen derselben Transaktion verwendet.
<SOAP-ENV:Envelope xml:space="preserve"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
xmlns:sql="https://schemas.microsoft.com/sqlserver/2004/SOAP"
xmlns:sqlsoaptypes="https://schemas.microsoft.com/sqlserver/2004/SOAP/types"
xmlns:sqlrowcount="https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlRowCount" xmlns:sqlmessage="https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlMessage" xmlns:sqlresultstream="https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlResultStream" xmlns:sqltransaction="https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
<SOAP-ENV:Header xmlns:sqloptions="https://schemas.microsoft.com/sqlserver/2004/SOAP/Options">
<sqloptions:sqlSession sessionId="jGqn3/X73EGHjFxZ12zovw==" timeout="1200"> </sqloptions:sqlSession>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<sql:sqlbatchResponse>
<sql:sqlbatchResult>
<sqlresultstream:SqlTransaction xsi:type="sqltransaction:SqlTransaction">
<sqltransaction:Descriptor>AQAAADMAAAA=</sqltransaction:Descriptor>
<sqltransaction:Type>Begin</sqltransaction:Type>
</sqlresultstream:SqlTransaction>
</sql:sqlbatchResult>
</sql:sqlbatchResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Der Client ist dann in der Lage, die Transaktion in nachfolgenden SOAP-Anforderungen manuell zu verknüpfen, indem er die Sitzungs-ID und den Transaktionsdeskriptor verwendet, den der Server in der vorigen Antwort zurückgegeben hatte. Dies ist im folgenden Beispiel dargestellt.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
xmlns:sql="https://schemas.microsoft.com/sqlserver/2004/SOAP"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sqlparam="https://schemas.microsoft.com/sqlserver/2004/sqltypes/SqlParameter"
xmlns:sqlsoaptypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes"
xmlns:sqloptions="https://schemas.microsoft.com/sqlserver/2004/SOAP/Options">
<SOAP-ENV:Header>
<sqloptions:sqlSession sessionId="jGqn3/X73EGHjFxZ12zovw==" transactionDescriptor="AQAAADMAAAA="/>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<sql:sqlbatch>
<sql:BatchCommands>
INSERT INTO session_table values (2005)
COMMIT TRANSACTION
</sql:BatchCommands>
</sql:sqlbatch>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Eine SOAP-Anforderung kann eine Transaktion nur dann explizit verknüpfen, wenn der Batch innerhalb derselben SOAP-Sitzung ausgeführt wird, in der auch die Transaktion gestartet wurde. Ansonsten wird ein SOAP-Fehler zurückgegeben, wenn eine der folgenden Bedingungen zutrifft:
Eine unterschiedliche SOAP-Sitzungs-ID wird angegeben.
Die SOAP-Sitzungs-ID wird nicht angegeben.
Der Transaktionsdeskriptor ist für die aktuelle SOAP-Sitzung ungültig.
Es kann immer nur eine einzige Transaktion im transactionDescriptor-Attribut für sqlSession-Header verwendet werden. Zum Erstellen mehrerer unabhängiger Transaktionen innerhalb derselben Sitzung können Sie die Eintragung in die Sitzung durchführen, indem Sie den sqlSession-Header ohne Angabe des transactionDescriptor-Attributs verwenden. Beachten Sie, dass bei diesem Konzept davon ausgegangen wird, dass die Clientanwendung die verschiedenen transactionDescriptor-Werte zurückverfolgt. Wenn mehrere unabhängige Transaktionen innerhalb derselben Sitzung aktiv sind, gibt es keinen Unterschied beim Verknüpfen einer Transaktion: Geben Sie einfach das transactionDescriptor-Attribut für den sqlSession-Header in einer SOAP-Anforderung an.
Hinweis |
---|
Um zu ermitteln, welche Ebene die aktiven geschachtelten Transaktionen besitzen, können Sie den Wert der Transact-SQL-Funktion @@TRANCOUNT lesen und verwenden. |
XSD-Schema für sqlTransaction
Es folgt das XSD-Schema für den sqlTransaction-Header, der in SOAP-Meldungen verwendet wird:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace="https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction">
<xsd:annotation><xsd:documentation xml:lang="en">
(c) Copyright 2004, Microsoft Corporation

The following schema for Microsoft SQL Server is presented in XML format and is for informational purposes only. Microsoft Corporation ("Microsoft") may have trademarks, copyrights, or other intellectual property rights covering subject matter in the schema.

Microsoft does not make any representation or warranty regarding the schema or any product or item developed based on the schema. The schema is provided to you on an AS IS basis. Microsoft disclaims all express, implied and statutory warranties, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, and freedom from infringement. Without limiting the generality of the foregoing, Microsoft does not make any warranty of any kind that any item developed based on the schema, or any portion of the schema, will not infringe any copyright, patent, trade secret, or other intellectual property right of any person or entity in any country. It is your responsibility to seek licenses for such intellectual property rights where appropriate.

MICROSOFT SHALL NOT BE LIABLE FOR ANY DAMAGES OF ANY KIND ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SCHEMA, INCLUDING WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL (INCLUDING ANY LOST PROFITS), PUNITIVE OR SPECIAL DAMAGES, WHETHER OR NOT MICROSOFT HAS BEEN ADVISED OF SUCH DAMAGES.
</xsd:documentation></xsd:annotation>
<xsd:complexType name="SqlTransaction">
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element name="Descriptor" type="xsd:base64Binary" />
<xsd:element name="Type">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Begin"/>
<xsd:enumeration value="Commit"/>
<xsd:enumeration value="Rollback"/>
<xsd:enumeration value="EnlistDTC"/>
<xsd:enumeration value="Defect"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Der XSI-Typ für eine SQL-Transaktion ist xsi:type="typesNs:SqlTransaction", wobei typesNs an den https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction-Namespace gebunden ist.
Siehe auch