다음을 통해 공유


System.Transactions 사용

적용 대상: SQL Server

System.Transactions 네임스페이스는 ADO.NET 및 SQL Server CLR(공용 언어 런타임) 통합과 완전히 통합된 트랜잭션 프레임워크를 제공합니다. System.Transactions.TransactionScope 클래스는 연결을 암시적으로 분산 트랜잭션에 등록함으로써 코드 블록에 트랜잭션을 적용합니다. Complete 로 표시된 코드 블록의 끝에서 TransactionScope메서드를 호출해야 합니다. 프로그램 실행이 코드 블록을 벗어나면 Dispose 메서드가 호출되므로 Complete 메서드가 호출되지 않으면 트랜잭션이 중단됩니다. 코드가 범위를 벗어나도록 하는 예외가 throw된 경우 트랜잭션은 중단된 것으로 간주됩니다.

using 블록을 사용하여 using 블록이 종료될 때 TransactionScope 개체에서 Dispose 메서드가 호출되도록 하는 것이 좋습니다. TransactionScope의 기본 제한 시간이 1분이므로 보류 중인 트랜잭션을 커밋하거나 롤백하지 않으면 성능이 크게 저하될 수 있습니다. using 문을 사용하지 않는 경우 Try 블록에서 모든 작업을 수행하고 Dispose 블록에서 명시적으로 Finally 메서드를 호출해야 합니다.

TransactionScope내에서 예외가 발생하면 트랜잭션이 일관성이 없는 것으로 표시되고 중단된 후 TransactionScope가 삭제되면 롤백됩니다. 예외가 발생하지 않으면 참여하는 트랜잭션이 커밋됩니다.

TransactionScope는 로컬 및 원격 데이터 원본 또는 외부 리소스 관리자에 액세스하는 경우에만 사용해야 합니다. TransactionScope컨텍스트 연결 내에서만 사용되는 경우에도 트랜잭션이 항상 승격되기 때문입니다.

참고 항목

TransactionScope 클래스는 기본적으로 SerializableSystem.Transactions.Transaction.IsolationLevel을 사용하여 트랜잭션을 만듭니다. 애플리케이션에 따라 애플리케이션에서 경합을 줄이기 위해 격리 수준을 낮추는 방안을 고려해 볼 수 있습니다.

참고 항목

중요한 데이터베이스 리소스를 사용하므로 원격 서버에 대해 분산 트랜잭션 내에서 업데이트, 삽입 및 삭제만 수행하는 것이 좋습니다. 로컬 서버에서 작업을 수행하려는 경우 분산 트랜잭션이 필요하지 않으며 로컬 트랜잭션으로 충분합니다. SELECT 문은 데이터베이스 리소스를 불필요하게 잠글 수 있으며 일부 시나리오에서는 선택 항목에 트랜잭션을 사용해야 할 수 있습니다. 다른 트랜잭션된 리소스 관리자가 포함되지 않는 한 비 데이터베이스 작업은 트랜잭션 범위 외부에서 수행해야 합니다. 트랜잭션 범위 내의 예외로 인해 트랜잭션이 커밋 되지 않지만 TransactionScope 클래스에는 코드가 트랜잭션 자체의 범위를 벗어나 변경한 내용을 롤백하는 프로비전이 없습니다. 트랜잭션이 롤백될 때 몇 가지 작업을 수행해야 하는 경우 System.Transactions.IEnlistmentNotification 인터페이스의 고유한 구현을 작성하고 명시적으로 트랜잭션에 참여해야 합니다.

예시

System.Transactions사용하려면 System.Transactions.dll 파일에 대한 참조가 있어야 합니다.

다음 코드에서는 SQL Server의 서로 다른 두 인스턴스에 대해 승격할 수 있는 트랜잭션을 만드는 방법을 보여 줍니다. 이러한 인스턴스는 TransactionScope 블록에 래핑된 두 개의 서로 다른 System.Data.SqlClient.SqlConnection 개체로 표시됩니다. 이 코드는 using 문을 사용하여 TransactionScope 블록을 만들고 첫 번째 연결을 열어 TransactionScope자동으로 등록합니다. 이 트랜잭션은 처음에 완전 분산 트랜잭션이 아니라 간단한 트랜잭션으로 인리스트먼트됩니다. 코드는 조건부 논리(간결성을 위해 생략됨)가 있다고 가정합니다. 필요한 경우에만 두 번째 연결을 열고 TransactionScope등록합니다. 연결이 열리면 트랜잭션은 완전 분산 트랜잭션으로 자동 승격됩니다. 그런 다음, 코드는 트랜잭션을 커밋하는 TransactionScope.Complete를 호출합니다. 이 코드는 연결에 대한 using 문을 종료할 때 두 연결을 삭제합니다. TransactionScope에 대한 TransactionScope.Dispose 메서드는 TransactionScope에 대한 using 블록이 종료될 때 자동으로 호출됩니다. TransactionScope 블록의 어느 지점에서든 예외가 throw된 경우 Complete가 호출되지 않으며 TransactionScope가 삭제되면 분산 트랜잭션이 롤백됩니다.

Visual Basic

Using transScope As New TransactionScope()  
    Using connection1 As New SqlConnection(connectString1)  
        ' Opening connection1 automatically enlists it in the   
        ' TransactionScope as a lightweight transaction.  
        connection1.Open()  
  
        ' Do work in the first connection.  
  
        ' Assumes conditional logic in place where the second  
        ' connection will only be opened as needed.  
        Using connection2 As New SqlConnection(connectString2)  
            ' Open the second connection, which enlists the   
            ' second connection and promotes the transaction to  
            ' a full distributed transaction.  
            connection2.Open()  
  
            ' Do work in the second connection.  
  
        End Using  
    End Using  
  
    ' Commit the transaction.  
    transScope.Complete()  
End Using  

C#

using (TransactionScope transScope = new TransactionScope())  
{  
    using (SqlConnection connection1 = new   
       SqlConnection(connectString1))  
    {  
        // Opening connection1 automatically enlists it in the   
        // TransactionScope as a lightweight transaction.  
        connection1.Open();  
  
        // Do work in the first connection.  
  
        // Assumes conditional logic in place where the second  
        // connection will only be opened as needed.  
        using (SqlConnection connection2 = new   
            SqlConnection(connectString2))  
        {  
            // Open the second connection, which enlists the   
            // second connection and promotes the transaction to  
            // a full distributed transaction.   
            connection2.Open();  
  
            // Do work in the second connection.  
        }  
    }  
    //  The Complete method commits the transaction.  
    transScope.Complete();  
}  

참고 항목

CLR 통합 및 트랜잭션