방법: Visual C# .NET에서 ServicedComponent에서 사용하여 .NET 공급자 사용하여 분산된 트랜잭션 수행

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

316247
이 문서에서는 Microsoft Visual Basic .NET 버전에 316627 참조하십시오.

이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리의 네임스페이스를 참조합니다.
  • System.Data.SqlClient
  • System.EnterpriseServices
  • System.Runtime.CompilerServices
  • System.Reflection

이 작업의

요약
이 문서에서는 ServicedComponent에서 클래스와 .NET 공급자를 사용하여 분산된 트랜잭션을 수행하는 방법을 보여 줍니다. 이 문서에서는 Microsoft SQL Server 서버에 대해 SqlClient .NET 공급자가 사용하지만 ODBC 또는 OLE DB .NET 관리되는 공급자를 사용할 수도 있습니다.

back to the top

요구 사항

다음은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩의 목록입니다.
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server Microsoft Windows 2000 고급 서버
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 또는 Microsoft SQL Server 2000
back to the top

개요

이렇게 하려면 클래스 준비하는 경우 .NET Framework 클래스의 인스턴스를 자동 트랜잭션에 참여할 수 있습니다. 클래스 인스턴스 또는 개체에 액세스하는 각 리소스 트랜잭션에 참여합니다. 예를 들어, 데이터베이스의 계정의 돈을 게시할 ADO.NET 개체를 사용하는 경우 리소스 관리자가 데이터베이스 개체가 트랜잭션에서 실행하는지 여부를 결정합니다. 개체가 트랜잭션에서 실행해야 하는 경우 리소스 관리자는 트랜잭션 데이터베이스에 자동으로 참여시킵니다.

자동 트랜잭션에 참여하도록 클래스를 준비하는 데 다음 과정을 수행하십시오.
  1. TransactionAttribute 클래스를 구성 요청을 자동 트랜잭션 형식을 지정하려면 클래스에 적용됩니다.

    트랜잭션 형식 TransactionOption 열거형 구성원이어야 합니다.
  2. ServicedComponent에서 클래스에서 클래스를 파생시킵니다. ServicedComponent에서 COM + 서비스를 사용하는 모든 클래스의 기본 클래스입니다.
  3. 어셈블리의 고유 키 쌍을 포함하는 확인해야 강력한 이름으로 어셈블리에 서명하십시오.
  4. 클래스를 COM + 카탈로그가 포함된 어셈블리를 등록하십시오.

    참고: 사용자 클래스의 인스턴스를 호출하는 클라이언트 공용 언어 런타임에서 관리되는 경우, 등록이 자동으로 수행됩니다. 관리되지 않는 호출자가 만들고 해당 클래스의 인스턴스를 호출하는 경우에만 이 단계가 필요합니다. .NET 서비스 설치 도구를 (Regsvcs.exe) 수동으로 어셈블리를 등록할 수 있습니다.
강력한 이름으로 어셈블리를 서명하는 방법에 대한 자세한 내용은 Microsoft .NET Framework 개발자 가이드 에서 다음 항목을 참조하십시오.
강력한 이름으로 어셈블리 서명
http://msdn.microsoft.com/en-us/library/xc31ft41.aspx
이 프로세스에 대한 자세한 내용은 Microsoft .NET Framework 개발자 가이드 에서 다음 항목을 참조하십시오.
자동 트랜잭션 및 .NET Framework 클래스
http://msdn.microsoft.com/en-us/library/ms123400.aspx
back to the top

프로젝트 만들기

  1. Visual C# .NET에서 새 콘솔 응용 프로그램 프로젝트를 만들려면 다음과 같이 하십시오.
    1. Visual Studio .NET 시작하십시오.
    2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
    3. 새 프로젝트 대화 상자의 Visual C# 프로젝트프로젝트 형식 에서 콘솔 응용 프로그램템플릿 차례로 클릭한 다음 확인 을 누릅니다.
    4. 솔루션 탐색기에서 Class1.cs 파일을 DistributedTransaction.cs로 이름을 바꿉니다.
  2. DistributedTransaction.cs 파일에서 모든 코드를 삭제하십시오.
  3. 프로젝트 메뉴에서 참조 추가 클릭한 다음 참조 추가:
    • System.EnterpriseServices
    • System.Data.dll

  4. AssemblyInfo.cs 파일에서 코드의 다음 줄을 주석:
    [assembly: AssemblyKeyFile("")][assembly: AssemblyKeyName("")]					
  5. DistributedTransaction.cs 파일에 다음 코드를 추가하여:
    using System;using System.Data.SqlClient;using System.EnterpriseServices;using System.Runtime.CompilerServices;using System.Reflection;[assembly: ApplicationName("DistributedTransaction")][assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]namespace DistributedTransaction{   /// <summary>   /// Summary description for Class1.   /// </summary>   class Class1   {      /// <summary>      /// The main entry point for the application.      /// </summary>      [STAThread]      static void Main(string[] args)      {         try         {            DistributedTran myDistributedTran = new DistributedTran();            myDistributedTran.TestDistributedTransaction();         }         catch (System.Data.SqlClient.SqlException e)         {            System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);         }               }   }   /// <summary>   /// Summary description for TestApp.   /// </summary>   [Transaction(TransactionOption.Required)]   public class DistributedTran: ServicedComponent    {      public DistributedTran()      {      }      [AutoComplete]      public string TestDistributedTransaction()      {         // The following Insert statement goes to the first server.         // This Insert statement does not produce any errors.          String insertCmdSql = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')";         // The following Delete statement goes to the second server.         // Because the table does not exist, this code throws an exception.         String exceptionCausingCmdSQL = "Delete from NonExistentTable";                              // The following connection strings create instances of two SqlConnection objects         // to connect to two different SQL Server servers in your environment.         // Modify the connection strings as necessary for your environment.         SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");         SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");         try         {            SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);            SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);               // This command runs properly.            insertCmd.Connection.Open();            insertCmd.ExecuteNonQuery();            // This command results in an exception, which automatically rolls back            // the first command (the insertCmd command).            exceptionCausingCmd.Connection.Open();            int cmdResult = exceptionCausingCmd.ExecuteNonQuery();                        SqlConn1.Close();            SqlConn2.Close();            Console.WriteLine("Hello");                     }         catch (System.Data.SqlClient.SqlException ex)         {            // After you catch the exception in this function, throw it.             // The service component receives this exception and             // aborts the transaction. The service component then            // throws the same exception, and the calling function            // receives the error message.            Console.WriteLine (ex.Message);            throw (ex);         }         finally          {            // Close the connection.            if (SqlConn1.State.ToString() == "Open")               SqlConn1.Close();            if (SqlConn2.State.ToString() == "Open")               SqlConn2.Close();         }         return "Success";             }   }}					
  6. 파일 메뉴에서 모두 저장 을 클릭하십시오.
  7. 시작 을 누르고, 프로그램, Visual Studio .NET, Visual Studio .NET 도구 차례로 가리킨 다음 Visual Studio .NET 명령 프롬프트 를 클릭하십시오.
  8. 프로젝트에 들어 있는 폴더를 열고 강력한 이름으로 어셈블리를 서명하려면 다음 명령을 실행하십시오.
    sn - k DistributedTransaction.snk
  9. 응용 프로그램을 빌드하십시오.
  10. 다음 표에서는 첫 번째 SQL Server 서버를 만듭니다:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[TestTransaction]GOCREATE TABLE [dbo].[TestTransaction] (	[Col1] [int] NULL ,	[Col2] [varchar] (100) NULL ) ON [PRIMARY]GO 					
  11. 응용 프로그램을 실행하십시오. 예상되는 동작은 되는 다음과 같은 오류 메시지가 나타납니다.
    트랜잭션이 중단되었습니다: 반환된 오류: 잘못된 개체 이름 'NonExistentTable'.
  12. SQL Server 쿼리 분석기를 열고 다음 코드를 추가하여 다음 쿼리를 실행하려면 F5 키를 눌러:
    USE NORTHWIND;SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'						
    쿼리를 트랜잭션이 중단되었습니다 때문에 행을 반환하지 않도록 유의하십시오.
  13. Visual C# 프로젝트에서 다음과 같은 코드를 찾습니다:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";						
    SQL 문을 중단 트랜잭션이 발생하지 않는 유효한 쿼리 바꿉니다. 예를 들어,:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";					
  14. 컴파일할 응용 프로그램을 다시 실행하려면 F5 키를 눌러.
  15. 명령을 쿼리 분석기에서 단계의 12 다시 실행하십시오. 트랜잭션이 성공적으로 완료할 수 있었기 때문에 행을 반환하는 쿼리를 확인.
NOTES:
  • 이 예제는 오류 처리를 수행하지 않습니다.
  • SQL Server 및 Microsoft 분산 트랜잭션 코디네이터 MS DTC) 모든 클라이언트와 서버를 실행하고 있어야 합니다.
back to the top
참조
자세한 내용은 아래 문서 번호를 눌러 Microsoft 기술 자료에 있는 문서를 클릭하십시오.
306296방법: Visual C# .NET에서 트랜잭션을 사용하는 서비스 대상된 .NET 구성 요소 만들기

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 316247 - 마지막 검토: 09/04/2003 20:36:34 - 수정: 3.3

Microsoft ADO.NET 1.0, Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Enterprise Services (included with the .NET Framework) 1.0, Microsoft Enterprise Services (included with the .NET Framework 1.1)

  • kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316247 KbMtko
피드백