2013-05-20 3 views
1

처음으로 Nhibernate를 사용하고 있는데 BeginTransaction 메서드를 호출하면 데이터베이스가 잠긴다는 것을 알았습니다. 대신 엔터티 프레임 워크 (ObjectContext 또는 DbContext)는 메모리의 모든 변경 사항을 유지하고 db를 잠그지 않고 오류가 발생하지 않으면 SaveChange 메서드가 완벽하게 작동합니다.Nhibernate - 잠금 DB

EF와 같은 일부 기능을 Nhibernate하고 있습니까?

+0

'IsolationLevel'을 가지고 놀고 싶을 수도 있습니다. 기본값은'ReadCommitted'이지만'BeginTransaction'에서 변경할 수 있습니다. 특정 프로젝트에서 스냅 샷을 사용해야했습니다. –

+0

성과를 측정하고 거래가 병 목인지 확인 했습니까? – jgauffin

+0

리소스 잠금에 대해 싫어합니다. 하지만 언젠가 유용하다고 생각하지만 엔티티 프레임 워크와 비슷한 동작을 선호합니다. Nhibernate에서 IsolationLevel 옵션을 어디에 설정할 수 있습니까? – bit

답변

2

당신은 당신이 뭔가를 할 수 있습니다, 낙관적 동시성을 사용하는 경우 :

MyEntity myEntity; 
using(var scope = new TransactionScope(TransactionScopeOption.Suppress)) 
using(var session = sessionFactory.OpenSession()) 
{ 
    myEntity = session.Get<MyEntity>(id); 
    scope.Complete(); 
} 

// No longer in a transaction... 
myEntity.Add(something); 
myEntity.Update(somethingElse); 

// Later, possibly in another request... 

using(var scope = new TransactionScope(TransactionScopeOption.Required)) 
using(var session = sessionFactory.OpenSession()) 
{ 
    session.Update(myEntity); 
    scope.Complete(); 
} 

만큼 트랜잭션이 열려 (위에서 언급 한대로 격리 수준에 depdending)대로 당신은 가능성이 공유됩니다 자물쇠에 초기 선택에 관련된 테이블과 키는 트랜잭션이 완료 될 때까지 해당 테이블에 대한 갱신을 차단합니다. 이러한 잠금을 피하려면 읽기 트랜잭션을 억제하고 수정 작업을 수행 한 다음 나중에 개체를 업데이트 할 수 있습니다. 엔티티의 버전 번호는 손실 된 업데이트로부터 사용자를 보호해야합니다.

읽기 트랜잭션을 억제 할 필요가 없습니다. 모든 쓰기가 커밋 될 때까지 차단하려는 경우 업데이트 트랜잭션과 별개이며 가능한 한 빨리 완료되는 한 읽기를 중심으로 트랜잭션을 요구할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 저는 그것을 좋아하지 않습니다. 엔티티 프레임 워크와 같은 것을 구현하는 것이 더 좋을 것 같습니다. 예를 들어, 사용자 정의 개체로 메모리의 모든 변경 사항을 처리하고 마지막으로 BeginTransaction-Commit을 호출 할 수 있습니다. NHibernate. 이렇게하면 EF가하는 일을 정확하게 수행 할 수 있습니다. 당신은 무엇을 생각합니까? – bit

+1

새 개체를 저장하는 경우 세션을 열고 트랜잭션을 시작하기 전에 개체 그래프를 구성 할 수 있습니다. 객체를 업데이트하는 경우 잠금을 유지하지 않고 "메모리 내"업데이트를 수행하는 유일한 방법은 다음과 같습니다. 1) 트랜잭션없이 객체를 읽습니다 (억제하지 않습니다). 2) 트랜잭션에서 객체를 읽고 객체를 업데이트하기 전에 트랜잭션을 끝내십시오. 또는 3) 트랜잭션 격리 수준을 완화하십시오 (여전히 잠금을 유지할 것입니다). 세션에서 객체 그래프를 분리하는 것이 문제가되면 단일 세션에서 여러 트랜잭션을 사용할 수 있습니다. –

관련 문제