2

누구든지이 주제에 대해 저를 업데이트 할 수 있습니까?DTC로 에스컬레이션/스패닝하지 않고도 SQL Server 및 Oracle 용 EF 및 TransactionScope를 사용할 수 있습니까?

내 응용 프로그램에서 SQL Server와 Oracle을 모두 지원하고 싶습니다.

분산 트랜잭션 (DTC)으로 에스컬레이션/스패닝하지 않고도 SQL Server와 Oracle 모두에서 다음 코드 (BL)를 사용할 수 있습니까?

// dbcontext is created before, same dbcontext will be used by both repositories 
using (var ts = new TransactionScope()) 
{ 
    // create order - make use of dbcontext, possibly to call SaveChanges here 
    orderRepository.CreateOrder(order); 

    // update inventory - make use of same dbcontext, possibly to call SaveChanges here 
    inventoryRepository.UpdateInventory(inventory); 

    ts.Complete(); 
} 

현재까지 2013 년 8 월말에 SQL Server 2008 이상에서 작동하는 것으로 알고 있지만 오라클은 어떤가요? 나는 이것을 찾았습니다 thread ... 오라클이 분산 트랜잭션으로 승격하고있는 것처럼 보이지만 여전히 명확하지 않습니다.

누구나 SQL Server와 Oracle을 지원하는 Entity Framework를 사용하는 응용 프로그램 작성 경험이 있습니까?

감사합니다.

업데이트 : 마지막으로 EF6이 Improved Transaction Support과 함께 제공됩니다. 이것은 Remus의 권고에 더하여 저를위한 해결책이 될 수 있습니다.

+0

또는에서을 "트랜잭션 및 연결 연결 연결 개체가 닫혀 또는 거래의 객체가 배치 된 경우에만 ODP.NET 연결은 기본적으로 거래에서 분리" 적어도, 내 목표를 달성하는 데 사용할 수있는 다른 ORM/Oracle Data Provider를 알려줄 사람이 있습니까? – Learner

답변

1

먼저 : var ts = new TransactionScope()을 사용하지 마십시오. 하나의 라이너가 앱을 죽이는가? 격리 수준을 지정할 수있는 명시 적 생성자를 항상 사용하십시오. using new TransactionScope() Considered Harmful을 참조하십시오.

이제 귀하의 질문 : DTC에 동일한 범위에서 두 개의 연결을 승격시키지 않는 논리는 드라이버/공급자가 시스템에 알리기 위해 협조해야합니다. 두 개의 별개의 연결이 분산 트랜잭션을 잘 관리 할 수 ​​있다는 점에 유의하십시오 관련된 자원 관리자가 동일하기 때문에 자체적으로 SqlClient 게시 SQL Server 2008은이 논리를 수행 할 수있는 드라이버입니다. 당신이 사용하는 오라클 드라이버가 아닙니다 (그리고 저는 btw 인 모든 버전을 알지 못합니다).

궁극적으로 정말 정말 기본적인 내용입니다. DTC가 필요하지 않다면 만들지 마십시오! 범위에서 정확히 하나의 연결을 사용해야합니다. 두 개의 연결이 필요 없다는 것은 분명히 논쟁의 여지가 있습니다. 즉, 데이터 모델에서 두 개의 개별 리포지토리를 제거하십시오. 주문, 재고 및 그 밖의 무엇을 위해 하나의 저장소 만 사용하십시오. 당신은 그 (것)들에 발에서 너 자신을 쏘고있다 그리고 당신은 pixie 먼지 해결책을 요구하고있다.

업데이트 : Oracle driver 12c r1 :

:

+0

안녕하세요 레무스 ... 당신이 같이 왔기 때문에 정말 기쁩니다. 전에도 오래 전에 저를 도왔습니다. 나는 이미이 물건에 열중하고있다 ... 그래서 오라클은 아마 그것을 해결할 수 없다. 그런데 내 목표를 달성하기 위해 내 BL을 어떻게 보이게 할 수 있는지 정말로 확신 할 수 없습니다. 나 한테 5 분만 채팅하게 해주시겠습니까? – Learner

+0

나는 자신의 POCO와 함께 자신의 비즈니스 객체 (BL에 사용됨)와 EF가있는 프로젝트를 가지고있다.여러 개의 관련 비즈니스 객체를 삽입하고 싶지만 이전에 삽입 된 객체의 ID를 자동 생성하는 외래 키가있는 객체를 추후에 삽입하려면 'SaveChanges'를 여러 번 호출해야합니다. SaveChanges를 여러 번 호출하면 Oracle 용으로 에스컬레이션한다고 생각합니까? (참고 : BL에서는 POCO가 없기 때문에 탐색 속성을 사용할 수 없습니다.) – Learner

+0

AFAIK .SaveChanges를 여러 번 호출하면 문제가되지 않습니다. 문제는 두 개의 서로 다른 EF 컨텍스트 인 'orderRepository'와'inventoryRepository'를 사용한다는 사실에서 발생합니다. –

1

아니요, DTC는 분산 트랜잭션에 필요하지 않습니다. 이와 같이 2 가지 데이터베이스 기술에 걸친 것은 분산 트랜잭션입니다. 죄송합니다!

관련 문제