nhibernate 을 사용하고 데이터베이스에서 데이터가 변경되었을 때 staleobjectStateException을 던지지 않습니다.

StackOverflow https://stackoverflow.com/questions/1823445

문제

SQL 타임 스탬프 열을 버전 번호로 사용하여 낙관적 동시성 제어 기능을 갖춘 엔티티가 NHibernate에 매핑되어 있습니다. 매핑은 다음과 같습니다.

<class name="Entity" optimistic-lock="version" discriminator-value="0">
    <id name="id">
        <generator class="native" />
    </id>
    <version name="Version" column="Version" generated="always" unsaved-value="null" type="System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    ...
    <subclass name="ChildEntity" discriminator-value="1" />
</class>

데이터베이스의 데이터가 레코드 업데이트 사이의 데이터가 변경 될 때 어떻게되는지 테스트하고 있습니다. 그렇게하려면 NHibernate가 업데이트하는 과정에있는 테이블의 레코드 중 하나에 대해 업데이트 명령문을 직접 실행하고 있습니다. 이 직접 업데이트는 테이블의 레코드 버전 번호를 변경합니다.

예상대로 NHibernate 관리 업데이트는 특정 행에서 발생하지 않습니다 (이것은 양호). 그러나 커밋 중에는 예외가 발생하지 않습니다. 트랜잭션이 커밋 될 때 StaleObjectStateException이 발생하여 트랜잭션을 롤백하고 사용자에게 알릴 수있었습니다. 이것이 예상되는 행동이 아닌가? 내가 뭔가를 놓치고 있습니까?

거래를 커밋하는 내 코드는 다음과 같습니다.

_session.BeginTransaction();
...
// load objects in session
IList<ChildEntity> toChange = _session.Find('some condition');
foreach ( var itemToChange in toChange )
{
     itemToChange.Status = Status.Updated;
}
...
_session.Transaction.Commit();

항목은 동일한 세션에 속하며 모든 작업은 단일 거래 내에서 완료됩니다. Childentity는 Entity Base Class의 서브 클래스로 낙관적 인 잠금 장치가 버전으로 설정되어 있습니다.

도움이 되었습니까?

해결책 2

내 테스트가 부정확 한 것으로 보입니다. 테스트에서, 나는 다른 거래가 레코드를 업데이트 한 후 얻었습니다. 이 다른 업데이트로 행은 업데이트에 적합하지 않으므로 업데이트는 시도되지 않았습니다. GET 후 경쟁 업데이트를 위해 테스트를 변경했을 때 StaleObjectStateException이 예상대로 발생했습니다.

혼란을 드려 죄송합니다.

다른 팁

데이터를 어떻게 수정하고 있습니까? staleobjectexception은 nhibernate가 행을 업데이트하려고 시도하고 버전 번호가 더 이상 동일하지 않은 경우에만 발생합니다. 다른 열은 관련이 없습니다. 테스트에서 버전 번호를 업데이트하지 않을 수 있습니까?

전제는 이것입니다.

A. 사용자 A & B 버전 = 1 인 데이터베이스에서 객체를 가져옵니다.

SQL : SELECT [object] FROM [TABLE] where id = [id] and Version = 1

B. 사용자는 버전을 2로 변경하는 업데이트 객체

SQL : UPDATE [TABLE] SET [object] (& Set Version = 2) where id = [id] and Version = 1 1 행을 업데이트합니다

C. 사용자 B는 객체를 업데이트하려고 시도하지만 version = 1 (단계 1 단계)가있는 버전의 업데이트 객체로서 staleobjectexception을 가져옵니다.

SQL : UPDATE [TABLE] SET [object] where id = [id] and Version = 1 0 줄을 업데이트하고 staleobjectexception을 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top