1

バージョン番号として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によって更新されているテーブル内のレコードの1つに対して直接updateステートメントを実行しています。この直接更新により、テーブル内のレコードのバージョン番号が変更されます。

予想どおり、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();

アイテムは同じセッションに属し、すべての作業は1つのトランザクション内で完了します。ChildEntityは、オプティミスティックロックがバージョンに設定されているエンティティ基本クラスのサブクラスです。

4

2 に答える 2

5

データをどのように変更していますか?StaleObjectExceptionは、NHibernateが行を更新しようとし、バージョン番号が同じでなくなった場合にのみスローされます。他の列は関係ありません。テストでバージョン番号を更新していない可能性はありますか?

前提はこれです:

A.ユーザーAとBは、バージョン=1のデータベースからオブジェクトを取得します

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

B.バージョンを2に変更するユーザーAUpdatesオブジェクト

SQL:UPDATE [TABLE] SET [object] (& Set Version = 2) where id = [id] and Version = 1更新された1行を返します

C.ユーザーBはオブジェクトを更新しようとしますが、バージョン= 1(ステップ1で取得したバージョン)の更新オブジェクトがデータベース内の0レコードを更新するため、StaleObjectExceptionを取得します。

SQL:UPDATE [TABLE] SET [object] where id = [id] and Version = 1更新された0行を返し、StaleObjectExceptionがスローされます。

于 2009-12-01T03:01:56.443 に答える
0

私のテストは不正確だったようです。テストでは、他のトランザクションがレコードを更新した後にgetを実行していました。この他の更新により、行が更新の対象外になったため、更新は試行されませんでした。Getの後に競合する更新を行うようにテストを変更すると、期待どおりにStaleObjectStateExceptionがスローされました。

混乱させて申し訳ありません。

于 2009-12-01T20:00:37.323 に答える