Share via


연결 및 트랜잭션 관리(Entity Framework)

기본적으로 Entity Framework 는 데이터베이스에 대한 연결을 관리합니다. 그러나 Entity Framework 응용 프로그램에서 연결과 트랜잭션을 모두 수동으로 관리할 수 있습니다.

연결 및 Entity Framework

Entity Framework 는 쿼리를 실행하거나 SaveChanges를 호출해야 하는 등, 필요한 경우에만 연결을 연 다음 작업이 완료되면 연결을 닫습니다.

다음 메서드 중 하나를 호출하면 연결이 열립니다.

Bb896325.note(ko-kr,VS.100).gif참고:
쿼리 메서드가 호출되면 연결이 열리며 ObjectResult가 완전히 사용되거나 삭제될 때까지 열린 상태로 유지됩니다.

수동으로 연결 관리

Entity Framework 는 Connection 속성을 통해 EntityConnection을 노출합니다. 그러면 연결과 트랜잭션을 관리하거나 사용자 고유의 EntityConnection을 제공할 수 있습니다. 이 기능은 성능을 향상하거나 트랜잭션을 명시적으로 제어하기 위해 수명 짧은 개체 컨텍스트 내에서 연결을 열어둔 상태로 유지할 때 유용합니다. Entity Framework 에서 사용하는 것과 동일한 공급자 연결을 응용 프로그램의 다른 부분과 공유할 수 있습니다. 다음 예제에서는 연결을 명시적으로 여는 방법을 보여 줍니다.

' Explicitly open the connection. 
context.Connection.Open()
// Explicitly open the connection.    
context.Connection.Open();

자세한 내용은 방법: 수동으로 개체 컨텍스트의 연결 열기(Entity Framework)를 참조하십시오.

장시간 실행 중인 개체 컨텍스트에서 수동으로 연결을 열 때는 컨텍스트가 더 이상 필요 없을 때 연결이 닫히도록 하기 위해 Dispose 메서드를 호출해야 합니다. EntityConnectionClose 메서드를 호출하여 연결을 명시적으로 닫을 수도 있습니다. 자세한 내용은 방법: 장기 실행 개체 컨텍스트의 연결 관리(Entity Framework)를 참조하십시오.

또한 EntityConnection을 만들고 이 연결을 개체 컨텍스트에 제공할 수도 있습니다. 이 경우, 연결을 수동으로 직접 열 수도 있고 필요 시 개체 컨텍스트에서 연결을 열도록 허용할 수도 있습니다. EntityConnection을 개체 컨텍스트에 제공한 경우에는 컨텍스트와 EntityConnection이 더 이상 필요 없을 때 이 두 가지가 모두 삭제되는지 확인해야 합니다. 다음 예제에서는 연결을 만들고 이를 개체 컨텍스트에 전달합니다.

' Create an EntityConnection. 
Dim conn As New EntityConnection("name=AdventureWorksEntities")

' Create a long-running context with the connection. 
Dim context As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities");

// Create a long-running context with the connection.
AdventureWorksEntities context =
    new AdventureWorksEntities(conn);

자세한 내용은 방법: 개체 컨텍스트에서 EntityConnection 사용(Entity Framework)을 참조하십시오.

연결 관리 고려 사항

연결을 관리할 때 다음 사항을 고려해야 합니다.

  • 작업 시작 전에 연결이 열려 있지 않은 경우, 개체 컨텍스트가 연결을 엽니다. 작업 도중에 개체 컨텍스트가 연결을 여는 경우에는 작업 완료 시 항상 연결이 닫힙니다.

  • 수동으로 연결을 여는 경우 개체 컨텍스트가 연결을 닫지 않습니다. Close 또는 Dispose를 호출하면 연결이 닫힙니다.

  • 개체 컨텍스트가 연결을 만드는 경우 컨텍스트가 삭제되면 항상 연결이 삭제됩니다.

  • 장시간 실행 중인 개체 컨텍스트에서는 컨텍스트가 더 이상 필요 없을 때 삭제되는지 확인해야 합니다.

개체 컨텍스트에서 사용하도록 열린 EntityConnection을 제공하는 경우에는 삭제되는지 확인해야 합니다.

트랜잭션 및 Entity Framework

Entity Framework 는 자동 트랜잭션 인리스트먼트를 지원합니다. 즉, 쿼리 실행이나 데이터 소스에 데이터 변경 내용 저장과 같이 개체 컨텍스트 내에서 수행되는 작업은 데이터 소스 내에 격리할 수 있습니다. 이렇게 하려면 System.Transactions 트랜잭션의 내부에서 작업을 실행하면 됩니다. 트랜잭션은 Entity Framework 에서 다음 작업을 수행하는 데 사용됩니다.

  • 개체 변경 성공 여부에 의존하는 쿼리의 경우와 같이 일관성이 높아야 하는 여러 작업을 데이터 소스에 대해 실행합니다.

  • 전자 메일 알림을 보내거나 메시지 큐에 쓰는 경우와 같이 개체 컨텍스트 내 변경 내용을 다른 분산 작업과 조정합니다.

추가 리소스 관리자의 인리스트먼트가 필요한 트랜잭션을 분산 트랜잭션이라고 합니다. 분산 트랜잭션에서는 DTC(Distributed Transaction Coordinator)를 사용하여 트랜잭션 완료에 필요한 리소스를 관리합니다. 트랜잭션을 DTC로 승격하는 것은 설정하고 완료하기에 비교적 비용이 많이 드는 프로세스일 수 있습니다. SQL Server 2005와 같은 일부 리소스 관리자에서는 PSPE(Promotable Single Phase Enlistment) 트랜잭션 프로토콜을 지원합니다. 이 경우, 리소스 관리자가 트랜잭션을 호스팅하고 나중에 필요에 따라 DTC에서 관리하도록 에스컬레이션할 수 있습니다.

System.Transactions에 대한 자세한 내용은 Transaction Processing를 참조하십시오. SQL Server와 함께 System.Transactions를 사용하는 방법에 대한 자세한 내용은 System.Transactions Integration with SQL Server (ADO.NET)을 참조하십시오.

트랜잭션 관리 고려 사항

Entity Framework 와 함께 트랜잭션을 사용할 때 다음 사항을 고려해야 합니다.

  • 데이터 소스에 대한 작업만 트랜잭션 처리됩니다. 개체 컨텍스트 내 개체에 대한 변경 내용은 트랜잭션 처리되지 않습니다. 컨텍스트 내의 개체에 적용된 변경 내용은 트랜잭션 범위 밖에서 표시됩니다.

  • SaveChanges 호출 시 현재 트랜잭션이 존재하는 경우, Entity Framework 에서는 데이터 소스에 대한 작업에 이 트랜잭션을 사용합니다. 현재 트랜잭션이 없는 경우에는 작업을 위해 새 트랜잭션을 만듭니다. EntityTransaction, Transaction 또는 TransactionScope를 사용하여 트랜잭션을 정의할 수 있습니다.

    Bb896325.note(ko-kr,VS.100).gif참고:
    기존 트랜잭션에 인리스트먼트하려면 Entity Framework 에서 연결을 닫은 후 다시 열 수 있습니다.

  • Entity Framework 에서 SaveChanges 작업을 위해 새 트랜잭션을 만드는 경우, 개체 컨텍스트에서 개체의 변경 내용은 트랜잭션이 완료될 때까지 적용되지 않습니다. 이는 개체 컨텍스트의 상태와 데이터 소스의 일관성을 확보하기 위한 것입니다.

  • 단일 트랜잭션 내에서 연결이 닫히고 다시 열리는 경우 트랜잭션이 DTC로 승격될 수 있습니다. Entity Framework 는 연결을 자동으로 열고 닫기 때문에 트랜잭션 승격을 방지하기 위해 연결을 수동으로 열고 닫는 것을 고려해야 합니다. 자세한 내용은 방법: 수동으로 개체 컨텍스트의 연결 열기(Entity Framework)를 참조하십시오.

  • 트랜잭션에서 작업을 다시 시도할 계획이라면 트랜잭션이 완료되기 전에 컨텍스트의 개체 상태가 다시 설정되지 않도록 해야 합니다. 그러기 위해서는 acceptChangesDuringSave 매개 변수의 값을 false로 하고 SaveChanges를 호출한 다음 반드시 트랜잭션의 다른 작업이 성공적으로 완료된 후에 AcceptAllChanges를 호출해야 합니다. 자세한 내용은 방법: Entity Framework에서 트랜잭션 관리를 참조하십시오.

조정된 트랜잭션 재시도 작업 중의 일부로서, 먼저 AcceptAllChanges를 호출하지 않고 SaveChanges를 다시 호출할 수도 있습니다. 이 경우 Entity Framework 에서는 동일한 변경 내용을 데이터 소스에 다시 적용하려고 합니다.

단원 내용

방법: 수동으로 개체 컨텍스트의 연결 열기(Entity Framework)

방법: 장기 실행 개체 컨텍스트의 연결 관리(Entity Framework)

방법: 개체 컨텍스트에서 EntityConnection 사용(Entity Framework)

방법: Entity Framework에서 트랜잭션 관리