다음을 통해 공유


개체 서비스에서 트랜잭션 관리(Entity Framework)

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

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

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

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

자세한 내용은 MSDN Library의 Transaction Processing을 참조하십시오.

개체 서비스와 함께 트랜잭션을 사용할 때 다음 사항을 고려해야 합니다.

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

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

    Note참고

    기존 트랜잭션에 인리스트먼트하려면 개체 서비스에서 연결을 닫은 후 다시 열어야 합니다.

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

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

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

참고 항목

개념

Entity Framework용 EntityClient 공급자
개체 서비스에서 연결 관리(Entity Framework)

기타 리소스

개체 컨텍스트 관리(Entity Framework)