2010-05-29 2 views
1

성능 향상을 위해 때로는 버전 증가 (또는 버전 검사)없이 엔티티를 업데이트하려고합니다. LINQ TO SQL을 사용하여 방금 버전을 변경하지 않고 그대로 유지했습니다. NHibernate에서이 동작이 가능합니까?NHibernate - 버전 증가를 방지하는 방법이 있습니까?

+0

그러나 버전 필드의 요점을 무시하는 것은 아닙니다. "모든 변화에 따라 자동으로 업데이트되는 필드가 필요합니다. 오, 그런데, 모든 변경 사항으로 업데이트하지 않으려합니다." –

+0

이 버전 확인으로 인해 성능 문제가 발생 했습니까? – Amitabh

+0

나는 그것에 대해 의심한다. 버전의 요점은 낙관적 인 잠금입니다. "이 변경 사항을 버전 화하지 마십시오"라고 말하는 것은 "다른 사람이 동시에 엔티티를 수정하지 않는다는 것을 확신합니다."라고 말하면서, NHibernate에 말할 수 없다고 생각합니다. – ewernli

답변

1

수정 사항 중 일부는 이 정말로 중요하지 않습니다. 그래서 나는 수정을 간단하게 마지막 하나 승리를 만들고 싶습니다. 거래는 우리가 시간적 순서의 관점에서 말할 수 있도록, 원자 될 운명 동안

, 그것은 간단하지하고 항상 트랜잭션이 포함 된 경우/최초의 마지막 이야기 까다로운 조금이다. 예 :

T1: start 
T1: read row X with value A 
T2: start 
T2: read row X with value A 
T2: write row X with value A2 
T2: commit 
T1: write row X with value A1 
T1: commit 

T2는 T1 이후에 시작되지만 A2는 변경되지 않습니다. 어떤 거래가 "마지막 거래"입니까? 마지막으로 시작한 것, 또는 마지막으로 종료 한 것? (커밋은 실제로는 원 자성이지만 트랜잭션에는 여전히 기간이 있기 때문에 추론하기가 어렵습니다.)

낙관적 또는 비관적 잠금은 이러한 상황을 피하기위한 것이므로 트랜잭션 순서로 더 잘 생각할 수 있습니다.

다시 말하지만, 질문에 대한 답을 얻고 싶다면 실제로 원하는 것이면 두 엔터티에 동일한 데이터베이스 테이블을 두 번 매핑 할 수 있습니다. 하나의 엔터티에 @version이 있고 다른 하나에는 그렇지 않습니다. 그러나 그것은 다소 혼란 스러울 수 있습니다.

0

나는이 엔티티에 대한 모든 낙관적 인 잠금을 해제하고 싶지 않습니다. 그렇지 않으면 단순히 버전 속성을 제공하지 마십시오.하지만 버전을 증가시키지 않는 속성이 필요합니다. 그는 "낙관적 잠금"을 사용하여 지원됩니다 확인 : http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-property

낙관적-lock (옵션 - 디폴트는 true를) :이 프로퍼티에 대한 업데이트들이 optimistic 잠금을 획득하는 것을 필요로하는지 여부를 지정한다. 즉,이 속성이 더러울 때 버전 증가가 발생해야 하는지를 결정합니다.

관련 문제