Версия NHibernate не выдает исключение StaleObjectException, хотя оно должно - PullRequest
0 голосов
/ 10 июня 2019

У меня есть таблица со столбцом Версия для проверки параллелизма, отображаемая следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" auto-import="false" assembly="New1.Backend" namespace="New1.BO">
    <class name="VersionedTable" table="`VersionedTables`" schema="`dbo`">
        <cache usage="read-write" />
        <id name="Id" column="`Id`" type="System.Int32" >
            <generator class="NHibernate.Id.Enhanced.TableGenerator">
                <param name="increment_size">200</param>
                <param name="segment_value">VersionedTables</param>
                <param name="optimizer">pooled-lo</param>
            </generator>
        </id>
        <version name="Version" column="`Version`" generated="never" ></version>
        <property name="Attribute" column="`Attribute`" type="String" not-null="false" length="100" />
    </class>
</hibernate-mapping>

Как видите, я использую столбец с именем Версия или IntegerТип, как Версия.

Теперь это моя проблема (я объясню это с помощью пошагового примера):

  • Я открываю одну и ту же запись на двух разных страницах браузера.Из SQL Profiler я вижу, что их версия [1]

  • Я изменяю запись на первой странице.Мой SQL Profiler показывает, что SQL-запрос, который выполняется: update VersionedTable set Attribute='A', Version=2 where Id=[id] and Version=1 Обратите внимание, что версия была правильно увеличена до [2]

  • Теперь я перехожу квторое окно.Помните, что я уже загрузил предыдущую запись.Он думает, что Версия все еще [1].

  • Я изменяю значения и нажимаю «Сохранить».(Из данных моего действия Controller я также вижу, что версия, которую я получаю, является «устаревшей»: [1])

  • Теперь, что мне показывает мой SQL Profilerоднако: update VersionedTable set Attribute='B', Version=3 where Id=[id] and Version=2 (Ой !!!)

Обратите внимание, что каким-то образом при очистке процесс получил обновленное значение версии вместодержась за "несвежую" одну !!!Я не знаю как, когда или почему это происходит.Все, что я знаю, это то, что, хотя исключение StaleObject должно генерироваться , обе параллельные записи обновляются, обе изящно увеличивают версию!

У кого-нибудь есть идеи, почему это происходит и как я могу это остановить?Большое спасибо, заранее!

...