Udostępnij za pośrednictwem


Transakcji przy użyciu protokołu SOAP sesje

Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.

Często dokonywane jest transakcja przedłożone po up serii partii i wymagają wykonanie zamówione.Jeśli każda partia w transakcji nie zostanie ukończona, transakcja można wycofać, cofanie zmian wprowadzonych przez partie wcześniejszych w zakres transakcji i przywracanie danych podlegających usterce do poprzedniego stanu.

Zarzutu w tradycyjnych dostęp do danych SQL, odpowiedniego połączenia sieciowego, aby usługa wszystkich partii w transakcji multibatched podczas przetwarzania i wykonany.Na przykład, rozważmy następujący przykład relacji między 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ć zawarte i zatwierdzone w ramach tej samej partia; Jednakże transakcji (2) rozciągnięty na partie (2) i (3).Połączenie podstawowe przewiduje kontekście upewniając się, że transakcja wykonuje wszystkie instancje w porządku wymaganym.Dostęp HTTP SOAP przetwarzania transakcji nie można wykonać przy założeniu, że kontekst pojedynczego odpowiedniego połączenia sieciowego.W związku z tym aby obsługiwać przetwarzania transakcji multibatched, pojedynczej sesja protokołu SOAP pełni tę samą funkcję.Na przykład, poniższy kod ilustruje sposób może być ten sam wzorzec instancje i transakcji 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 aktywny każdej partia mogą być wykonywane w oddzielnych par komunikat żądanie i odpowiedź SOAP używając go jako podstawowej kontekstu.

Sposób obsługi SOAP transakcji są zarządzane przez program SQL Server

Transakcje SQL są inicjowane na wystąpienie z 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:

  • Rozpoczynanie transakcji

  • Zatwierdzenia transakcji

  • Wycofywanie transakcji

  • Zarejestrować transakcji usługi DTC

  • Wada DTC z transakcji

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

Tryb transakcji AUTOCOMMIT wynosi może być wystarczające dla transakcji (1) i (3) w poprzednim przykładzie.Jednakże transakcji (2) w tym przykładzie wymaganych więcej niż jednej partia i dlatego wymaga ręcznego zarządzanie transakcji.

Zarządzanie transakcjami ręcznie

Do ręcznego zarządzania zobowiązanie transakcji i wycofywania, klient protokołu SOAP musi zestaw sqloptions:environmentChangeNotification opcji przed rozpoczęciem sesja protokołu SOAP i wewnątrz nagłówka zestaw wartość jego transactionBoundary atrybut true, jak pokazano w poniższym przykładzie wiadomości żądania protokołu SOAP przykład:

<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 serwer, aby wyłączyć tryb transakcji AUTOCOMMIT wynosi dla bieżącej sesja.Serwer wyśle odpowiedź protokołu SOAP podobne do następujących, w którym sesja jest identyfikowany (jGqn3/X73EGHjFxZ12zovw==) i SqlTransaction zwracana jest wartość, która potwierdza zdarzenie instrukcji BEGIN TRANSACTION na serwerze i deskryptora transakcji (AQAAADMAAAA=) dla klient do używania w kolejnych żądań protokołu SOAP, które będzie częścią 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 będzie mógł ręcznie łączyć transakcji w SOAP kolejnych żądań przy użyciu tego samego Identyfikatora sesja i transakcyjnych deskryptora, który serwer zwrócił 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 można jawnie łączyć transakcji tylko wtedy, gdy partia jest wykonywany w ramach tej samej sesja protokołu SOAP, w 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 dla sqlSession nagłówki.Aby utworzyć wiele niezależnych transakcji w ramach tej samej sesja, możesz można zarejestrować w sesja za pomocą sqlSession nagłówek bez określania transactionDescriptor atrybut.Należy zauważyć, że takie podejście zakłada, że aplikacja klient jest rejestrowanie informacji o różnych transactionDescriptor wartości.Gdy wielu niezależnych transakcji w ramach tej samej sesja, nie ma żadnej różnicy w transakcję łączącą, wystarczy określić transactionDescriptor atrybut na sqlSession nagłówka w żądaniu protokołu SOAP.

Ostrzeżenie

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

Oto schematu XSD dla sqlTransaction nagłówek, który jest używany w wiadomości protokołu 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 dla transakcji SQL jest xsi:type="typesNs:SqlTransaction", gdzie typesNs jest związany z https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction obszaru nazw.