2011-04-19 2 views
3

저는 현재 데이터베이스 연결과 트랜잭션을 모두 래핑하는 UnitOfWork 구현을 만들었습니다.UnitOfWork 대 데이터베이스 연결

using (var uow = UnitOfWorkFactory.Create()) 
{ 
    // do db operations here through repositories 

    uow.SaveChanges(); 
} 
UOW에이 배치되기 전에 SaveChanges가 호출되지 않은 경우 롤백이 호출됩니다

.

uow가 연결과 트랜잭션을 모두 처리하도록하는 것은 나쁜 설계 선택입니까?

대부분의 작업이 데이터베이스에서 정보를 가져 오는 ASP.Net MVC 웹 사이트가 있다고 가정 해 보겠습니다. 데이터베이스에서 실제로 아무것도 수행하지 않는 트랜잭션을 작성/커밋하는 데 성능이 저하됩니까?

+1

'SELECT'문에 대해서도 항상 트랜잭션을 생성하는 데 문제가 있는지 확인 했습니까? 저는 백엔드 프로그래밍에 익숙하지 않습니다. 이것은 SQL 책에서 읽은 것입니다. "트랜잭션 내에서 SELECT 문을 실행하면 참조 된 테이블에 잠금이 생겨 다른 사용자 나 세션이 작업을 수행하지 못하도록 차단할 수 있습니다 또는 데이터를 읽는 중 "_ – Axel

답변

4

UoW를 구현하려면 SaveChanges이 연결 및 트랜잭션이 사용되는 유일한 장소 여야합니다. UoW는 SaveChanges이 호출 될 때 실행되어야하는 모든 명령을 수집하고 트랜잭션에서 실행합니다.

+1

항상 시작되는 트랜잭션은 어떻게됩니까? 저는 백엔드 프로그래밍에 익숙하지 않습니다. 이것은 SQL 책에서 읽은 것입니다. "트랜잭션 내에서 SELECT 문을 실행하면 참조 된 테이블에 잠금이 생겨 다른 사용자 나 세션이 작업을 수행하지 못하도록 차단할 수 있습니다 또는 데이터 읽기 "_ – Axel

0

도메인은 도메인에 따라 다릅니다. 나는 데이터베이스 접근이 이 아니기 때문에 누군가가 이것을 지적하기까지는 당신이 사용하는 것과 동일한 구현을 가지고있다. 실제로는이 당신의 도메인에 영향을 미친다.

그래서 저는 책임을 분열 시켰습니다. 내 UoW는 데이터베이스에 연결해야하는 리포지토리를 사용하기 때문에 여전히 연결이 필요합니다.

나는 UOW이 필요하지 않은 경우 내가이있을 것이다 그래서 : 트랜잭션

using (DatabaseConnectionFactory.Create()) { ... }

: 나는 UOW이 필요한 경우

using (var connection = DatabaseConnectionFactory.Create().BeginTransaction()) 
{ 
    // do stuff 

    connection.CommitTransaction(); 
} 

을 (일반적으로 거래와) :

using (var connection = DatabaseConnectionFactory.Create().BeginTransaction()) 
using (var uow = UnitOfWorkFactory.Create()) 
{ 
    // do stuff 

    connection.CommitTransaction(); 
} 

HTH

0

직접 작업 단위를 구현 했습니까? 리포지토리 패턴을 사용하여 ADO.NET EF를 살펴보십시오.

데이터베이스 작업을 트랜잭션으로 래핑해야하는 큰 캠프가 있습니다. 삽입물/업데이트/삭제 내용을 반드시 트랜잭션으로 래핑해야합니다.

즉, IDisposable을 구현하는 데이터베이스 개체를 사용 차단으로 래핑하십시오.