3

Entity Framework의 ObjectContext.Connection.BeginTransaction() 메서드가 반환하는 트랜잭션이 MSDTC (Microsoft Distributed Transaction Coordinator)의 지원을 사용하는지 여부를 확인하고 싶습니다.ObjectContext.Connection.BeginTransaction()은 MSDTC를 사용합니까?

MSDTC를 지원하지 않으면 트랜잭션을 사용할 수 있습니까?

+1

ObjectContext.Connection 정상적인 ADO.NET 연결, 그래서 그것은 엔티티 프레임 워크와 관련이없는 것 ... –

답변

5

특정 조건에서 MSDTC가 조정 한 트랜잭션으로 자동 승격됩니다. ObjectContext.SaveChanges()으로 전화 할 때마다 범위에 이미있는 트랜잭션이없는 경우 새 트랜잭션이 생성됩니다 (범위에 활성 트랜잭션이 이미있는 경우 해당 트랜잭션에 참여하게됩니다). 그러나 기본적으로 연결은 ObjectContext.SaveChanges()에 전화 할 때마다 열리고 닫힙니다. 따라서 메서드 시작 부분에 ObjectContext.Connection.BeginTransaction()을 호출 한 다음 원래 트랜잭션 (일부 SQL Server 및 Entity Framework 버전)을 보유하면서 ObjectContext.SaveChanges()을 여러 번 호출하면 트랜잭션이 MSDTC로 승격 될 수 있습니다. 단일 트랜잭션 내에서 다른 연결. 당신이 거래를 방지하기 위해 노력하고는 MSDTC로 승진하기 경우, 명시 적으로 처음에 연결을 열고이 완료되면 그것을 닫습니다

using(MyEntities context = new MyEntities()) 
using(DbConnection conn = context.Connection) 
{ 
    conn.Open(); 
    DbTransaction transaction = conn.BeginTransaction(); 

    // now do stuff within the transaction scope 

    transaction.Commit(); 
} 

그러나, 당신이 TransactionScope에를 사용하는 것이 좋습니다 그것의로, 더 유연하고 플랫폼 의존성이 적으며 나중에 MSDTC가 필요한 무언가가 실제로 필요하다고 결정할 경우 더 쉽게 만들 수 있습니다. EntityFramework 활성 TransactionScope에있을 경우 자동으로 트랜잭션에 참여합니다

using(TransactionScope transaction = new TransactionScope()) 
using(MyEntities context = new MyEntities()) 
using(DbConnection conn = context.Connection) 
{ 
    conn.Open(); 

    // now do stuff within the transaction scope 

    transaction.Complete(); 
} 
관련 문제