다음을 통해 공유


System.Transactions 사용

적용 대상:SQL Server

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

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

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 삭제될 때 분산 트랜잭션이 롤백됩니다.

  • C#
  • Visual Basic .NET
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 통합 및 트랜잭션