1

UnitOfWork 패턴을 사용하여 nHibernate 3을 사용하여 동시성 검사를 수행하려고합니다. nHibernate 및 동시성 검사

는 더 정확하게하려면

  • 열고 새로운 세션 세션, 세션에서
  • 부하 엔티티,
  • 가까운 세션,
  • 주고 사용자로드 된 개체에서 데이터를 편집하는 데 시간이,
  • 새 세션 열기,
  • 업데이트 데이터
  • 세션을 닫습니다.

저는 버전 엔티티에 타임 스탬프를 사용하고 있습니다. 여기

내가 SQL에서

var entity = <updated by user> 
using (var session = GetNewSession()) 
{ 
    //todo: load current version value/attach entity to context 
    session.SaveOrUpdate(entity); 
    //if concurency check fails, StaleObjectException (or similar) is expected to be thrown 
} 

는이

UPDATE ENTITY SET LastEditDate = @P1, ... WHERE ID = @P2 AND LastEditDate = @P3 

where: 
@P1 - new LastEditDate 
@P2 - entity ID 
@P3 - previous LastEditDate 

ROWSMODIFIED의 경우처럼 작동한다 세션 컨텍스트에서 개체를 업데이트하는 방법을 전혀 모르는 내 매핑 파일

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="...." 
        namespace="...." 
        default-lazy="false">  
    <class name="Employee" 
     optimistic-lock="version" 
       dynamic-update="true"> 
    <id name="Id"> 
     <generator class="native" /> 
    </id> 
    <version column="LastEditDate" generated="always" type="timestamp" /> 
    <property name="Name" not-null="1" length="255" /> 
    <property name="LastEditUser" not-null="1" length="255"/> 
    </class>  
</hibernate-mapping> 

입니다 = 1의 경우는 갱신이 성공한 경우, 그 이외의 경우는 ConcurrencyException

Linq2Sql을 사용하면 버전 관리 열을 생성하고 엔티티를 새로운 세션 컨텍스트에 연결하고 업데이트를 시도하는 것이 매우 간단합니다.

nHiberate에서 어떻게 할 수 있습니까? 지원됩니까?

답변

0

session.Lock(entity,LockMode.Update)을 사용해야한다고 생각합니다.

+0

나는 낙관적 잠금을 사용하고 있습니다. 틀릴 수도 있지만 session.Lock은 비관적 인 잠금 시나리오처럼 보입니다. – tomo

+0

엔티티를 다른 세션에 저장하려면 엔티티를 새로운 세션에 잠글 필요가 있습니다. –

1
session.Update(entity) 

으로 충분해야합니다.