Udostępnij za pośrednictwem


Przy użyciu transakcji z sesji protokołu SOAP

This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Transakcja jest często dokonywana up serii partii przesłane po i wymagają wykonanie zamówione.Jeśli każda partia w transakcji nie zostało ukończone, transakcja może zostać przywrócona, cofanie zmian dokonanych przez wcześniejsze partii w ramach transakcji i przywracanie danych podlegających usterce do poprzedniego stanu.

W tradycyjnej SQL dostępu do danych odpowiedniego połączenia sieciowego jest zarzutu do obsługi wszystkich partii w ramach transakcji multibatched podczas przetwarzania i wykonany.Na przykład, należy wziąć pod uwagę następujące zależności między na przykład SQL Server połączenia i trzech różnych transakcji:

SQL connection(1)
     --> SQL batch(1)
          --> transaction(1)
     --> SQL batch(2)
          --> transaction(2a)
     --> SQL batch(3)
          --> transaction(2b), transaction(3)

Uwaga tej transakcji (1) i (3) wykonać się i są zaangażowane w obrębie tej samej serii; jednak transakcji (2) rozciągnięty na partia (2) i (3). Podstawowe połączenie zawiera kontekście upewnić się, że transakcja wykonuje wszystkie instancje w wymaganej kolejności.Dostęp HTTP SOAP przetwarzania transakcji nie można wykonać przy założeniu, że kontekście pojedynczego odpowiedniego połączenia sieciowego.W związku z tym aby zapewnić obsługę przetwarzania transakcji multibatched, pojedynczej sesja protokołu SOAP pełni tę samą funkcję.Na przykład poniższy kod przedstawia, jak takim samym wzorcem partii i transakcji może być wykonać w obszarze dostęp HTTP SOAP.

SOAP session(1)
     --> SQL batch(1)
          --> transaction(1)
     --> SQL batch(2)
          --> transaction(2a)
     --> SQL batch(3)
          --> transaction(2b), transaction(3)

Tak długo, jak tej samej sesja protokołu SOAP (1) pozostaje aktywne, każdej partia mogą być wykonywane w odrębnych par wiadomości żądanie/odpowiedź protokołu SOAP za pomocą go jako podstawowej kontekst.

Jak transakcje oparte na SOAP są zarządzane przez program SQL Server

Transakcje SQL są inicjowane w przypadku programu SQL Server gdy wystąpi zmiana stanu transakcji. Może to być spowodowane jedną z następujących zdarzeń występujących z powodu serwer przetwarza żądanie protokołu SOAP z klient:

  • Rozpoczęcie transakcji

  • zatwierdzanie transakcji

  • Wycofywanie transakcji

  • Zarejestrować transakcji usługi DTC

  • Usługa DTC błędów z transakcji

Domyślnie serwer działa w AUTOCOMMIT transakcji tryb.To zachowanie zakłada się dość proste jeden-do-jednego, partia - do - stosunek transakcji i nie zwraca żadnych informacji o transakcji (nagłówki, deskryptory) do klient.

Tryb transakcji autocommit może być wystarczające dla transakcji (1) i (3) w poprzednim przykładzie. Jednak transakcji (2) w tym przykładzie wymaga więcej niż jeden seryjne i w związku z tym wymaga ręcznego zarządzanie transakcji.

Ręczne zarządzanie transakcjami

Do ręcznego zarządzania zobowiązań transakcji i przywracanie, należy ustawić klient protokołu SOAP sqloptions:environmentChangeNotification opcji przed rozpoczęciem sesja protokołu SOAP, a w obrębie nagłówka należy ustawić wartość jego transactionBoundary atrybut do true, jak pokazano w poniższym przykładzie komunikat żądania protokołu SOAP przykładzie:

<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>

Informuje to serwer, aby wyłączyć tryb transakcji autocommit dla bieżącej sesja.Serwer wyśle odpowiedź protokołu SOAP, podobne do następujących, w którym sesja jest identyfikowane)jGqn3/X73EGHjFxZ12zovw==) i SqlTransaction zwracana jest wartość, która potwierdza zdarzenie instrukcji BEGIN TRANSACTION na serwer i (deskryptora do transakcjiAQAAADMAAAA=) dla klient do używania w kolejnych żądań protokołu SOAP, które mają wchodzić w skład tej samej transakcji.

<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>

Klient następnie będzie można ręcznie łączyć transakcji w kolejnych SOAP żądania przy użyciu tego samego IDENTYFIKATORA sesja i transakcyjnych deskryptora zwróconą przez serwer w poprzedniej odpowiedzi.Pokazano to na przykładzie poniżej.

<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>

Żądanie protokołu SOAP jawnie można dołączyć transakcji tylko wtedy, gdy dana partia jest wykonywana w obrębie tej samej sesja protokołu SOAP, pod którym transakcja została uruchomiona.W przeciwnym razie zwracany jest błąd protokołu SOAP jeśli spełniony jest jeden z następujących warunków:

  • Określono inny identyfikator sesja protokołu SOAP.

  • Nie określono IDENTYFIKATORA sesja protokołu SOAP.

  • Deskryptor transakcji nie jest prawidłowy dla bieżącej sesja protokołu SOAP.

Tylko jedna transakcja w czas mogą być używane w transactionDescriptor atrybut sqlSession nagłówków.Do tworzenia wielu transakcji niezależne w obrębie tej samej sesja, użytkownik może zarejestrować w sesja za pomocą sqlSession nagłówka bez określenia transactionDescriptor atrybut. Należy zauważyć, że takie podejście zakłada się, że aplikacja klient jest rejestrowanie informacji o różnych transactionDescriptor wartości.Gdy wiele transakcji niezależne w obrębie tej samej sesja, nie ma żadnej różnicy w przyłączanie się do transakcji, wystarczy określić transactionDescriptor atrybut sqlSession nagłówka w żądaniu protokołu SOAP.

Uwaga

To determine the level of nested transactions that are active, you can read and use the value of the Transact-SQL@@TRANCOUNT function.

Schematu XSD sqlTransaction

Poniżej przedstawiono schematu XSD dla sqlTransaction nagłówka, który jest używany w wiadomości SOAP:

<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">&#xd;&#xa;(c) Copyright 2004, Microsoft Corporation&#xd;&#xa;&#xd;&#xa;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.&#xd;&#xa;&#xd;&#xa;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.&#xd;&#xa;&#xd;&#xa;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.&#xd;&#xa;</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>

Typ XSI transakcję SQL jest xsi:type="typesNs:SqlTransaction", gdzie typesNs jest powiązane z https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction obszar nazw.