SOAP 세션에서 트랜잭션 사용
Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.
대개 트랜잭션은 차례로 전송되고 순서별 실행이 요구되는 일련의 배치 파일로 구성됩니다. 트랜잭션에서 완료되지 않은 일괄 처리가 있으면 트랜잭션 범위 내의 이전 일괄 처리에서 변경한 사항을 취소하고 영향을 받은 데이터를 이전 상태로 복원하여 트랜잭션을 롤백할 수 있습니다.
기존의 SQL 데이터 액세스에서는 기본 네트워크 연결을 통해 다중 일괄 처리 트랜잭션 내의 모든 일괄 처리를 처리하고 실행합니다. 예를 들어 한 SQL Server 연결과 3개의 트랜잭션 간의 관계를 보여 주는 다음 예를 참조하십시오.
SQL connection(1)
--> SQL batch(1)
--> transaction(1)
--> SQL batch(2)
--> transaction(2a)
--> SQL batch(3)
--> transaction(2b), transaction(3)
트랜잭션 (1)과 (3)은 동일한 일괄 처리 내에 포함되어 실행되고 커밋되지만 트랜잭션 (2)는 그 범위가 일괄 처리 (2)와 (3)으로 확장됩니다. 기본 연결은 트랜잭션이 모든 일괄 처리를 필요한 순서대로 실행할 수 있는 컨텍스트를 제공합니다. HTTP SOAP 액세스에서는 단일 기본 네트워크 연결의 컨텍스트를 사용하여 트랜잭션 처리를 수행할 수 없습니다. 따라서 다중 일괄 처리 트랜잭션을 처리하기 위해 단일 SOAP 세션이 사용됩니다. 예를 들어 다음 코드는 HTTP SOAP 액세스에서 위 예와 동일한 패턴의 일괄 처리 및 트랜잭션이 실행되는 방법을 보여 줍니다.
SOAP session(1)
--> SQL batch(1)
--> transaction(1)
--> SQL batch(2)
--> transaction(2a)
--> SQL batch(3)
--> transaction(2b), transaction(3)
동일한 SOAP 세션 (1)이 활성화되어 있는 동안에는 이를 기본 컨텍스트로 사용하여 별도의 SOAP 요청/응답 메시지 쌍으로 각 일괄 처리가 실행될 수 있습니다.
SQL Server의 SOAP 기반 트랜잭션 관리 방법
SQL 트랜잭션은 트랜잭션 상태가 변경될 때 SQL Server 인스턴스에서 시작됩니다. 서버가 클라이언트로부터의 SOAP 요청을 처리함에 따라 다음 이벤트 중 하나가 발생하면 트랜잭션이 시작됩니다.
Begin Transaction
Commit Transaction
Rollback Transaction
DTC Enlist in Transaction
DTC Defect from Transaction
기본적으로 서버는 자동 커밋 트랜잭션 모드에서 실행됩니다. 이 모드는 매우 단순한 일 대 일의 일괄 처리/트랜잭션 비율을 가정하므로 트랜잭션 정보(헤더, 설명자)를 클라이언트에 반환하지 않습니다.
앞의 예에 나오는 트랜잭션 (1)과 (3)에는 자동 커밋 트랜잭션 모드로 충분합니다. 그러나 트랜잭션 (2)에는 일괄 처리가 둘 이상 필요하므로 트랜잭션을 수동으로 관리해야 합니다.
수동으로 트랜잭션 관리
트랜잭션 커밋과 롤백을 수동으로 관리하려면 다음의 SOAP 요청 메시지 예에서처럼 SOAP 세션을 시작하기 전에 SOAP 클라이언트에서 sqloptions:environmentChangeNotification 옵션을 설정하고 이 헤더 내의 transactionBoundary 특성 값을 true로 설정해야 합니다.
<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>
이렇게 하면 현재 세션에 대해 자동 커밋 트랜잭션을 해제하라는 정보가 서버로 전달됩니다. 그러면 서버에서는 다음과 같은 SOAP 응답을 보냅니다. 이 SOAP 응답에서는 세션 ID(jGqn3/X73EGHjFxZ12zovw==)가 나타나고 서버에서 BEGIN TRANSACTION 이벤트를 확인하는 SqlTransaction 값과 이후 동일한 트랜잭션의 일부가 될 SOAP 요청에서 클라이언트가 사용할 트랜잭션 설명자(AQAAADMAAAA=)가 반환됩니다.
<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>
그러면 클라이언트는 이전 응답에서 서버가 반환한 것과 동일한 세션 ID와 트랜잭션 설명자를 사용하여 이후의 SOAP 요청에서는 수동으로 트랜잭션에 참가할 수 있습니다. 이는 다음 예에서 확인할 수 있습니다.
<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>
트랜잭션이 시작된 것과 동일한 SOAP 세션에서 일괄 처리가 실행되는 경우에만 SOAP 요청이 명시적으로 트랜잭션에 참가할 수 있습니다. 그렇지 않고 다음 중 하나에 해당하면 SOAP 오류가 반환됩니다.
다른 SOAP 세션 ID를 지정했습니다.
SOAP 세션 ID를 지정하지 않았습니다.
현재 SOAP 세션에 대해 트랜잭션 설명자가 유효하지 않습니다.
sqlSession 헤더의 transactionDescriptor 특성에는 트랜잭션을 한 번에 하나만 사용할 수 있습니다. 동일 세션 내에서 여러 개의 독립 트랜잭션을 만들려면 transactionDescriptor 특성을 지정하지 않고 sqlSession 헤더를 사용하여 세션에 참여합니다. 이 방법은 클라이언트 응용 프로그램이 각 transactionDescriptor 값을 추적한다고 가정합니다. 동일 세션 내에서 여러 개의 독립 트랜잭션이 활성화된 경우에는 한 개의 트랜잭션에 참가하는 것과 같으므로 SOAP 요청의 sqlSession 헤더에 transactionDescriptor 특성을 지정하십시오.
[!참고]
활성화된 중첩 트랜잭션의 수준을 확인하려면 Transact-SQL@@TRANCOUNT 함수의 값을 읽고 사용합니다.
sqlTransaction에 대한 XSD 스키마
다음은 SOAP 메시지에 사용되는 sqlTransaction 헤더에 대한 XSD 스키마입니다.
<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>
SQL 트랜잭션에 대한 XSI 유형은 xsi:type="typesNs:SqlTransaction"입니다. 여기서 typesNs는 https://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction 네임스페이스로 바인딩됩니다.