Есть ли что-то вроде «длительной автономной транзакции» для NHibernate или любого другого ORM? - PullRequest
1 голос
/ 17 марта 2010

По сути, это продолжение этого вопроса . Я начинаю чувствовать, что должен отказаться от всей идеи, но я сделаю еще один выстрел.

То, что я хочу, очень похоже на транзакцию с БД. Он должен отслеживать мои изменения в БД, а затем, в конце концов, позволить мне либо зафиксировать, либо откатить их. Если я вставлю объект, я должен вернуть его в следующем (соответствующем) запросе SELECT. Если я его удаляю, будущие запросы SELECT не должны его возвращать. И т.д.

Но есть одна загвоздка - эта транзакция будет очень продолжительной. Это началось бы, когда пользователь открыл форму (я говорю о Windows Forms здесь), и фиксация / откат был бы, когда пользователь закрыл ее (с помощью OK / Отмена). Так что это может занять от нескольких секунд до нескольких дней. Это требование исключает стандартную транзакцию БД, потому что это заблокирует таблицы / строки, к которым она прикоснулась, и другие пользователи не смогут использовать систему. Также транзакция не должна фиксировать ЛЮБЫЕ изменения в БД до тех пор, пока она не будет действительно зафиксирована. Поэтому, если один пользователь вносит некоторые изменения, другие не видят их, пока не будет нажата кнопка ОК. Это предотвращает ошибки в случае сбоя компьютера или его отключения от сети.

Я вполне в порядке, если решение накладывает ограничения на мою модель (я использую MSSQL 2008, кстати). Я могу создать БД / код так, как мне нравится. Я также согласен с мыслью, что фиксация может завершиться неудачей, потому что кто-то уже изменил один из объектов, к которым прикоснулась моя транзакция.

Есть что-нибудь подобное? Я посмотрел на NHibernate.Burrow, но я не уверен, что это то, что я хочу.

Добавлено: Это самое начало проекта, поэтому я не привязан к NHibernate. Я начал с этого, но я все еще могу легко измениться.

Ответы [ 5 ]

3 голосов
/ 17 марта 2010

Насколько я могу судить, DataObjects.Net поддерживает именно эту концепцию через DisconnectedState. Эта функция очень новая (выпущена всего несколько недель назад), ее предварительная документация здесь . Пример WPF для DataObjects.Net использует его для транзакций пользовательского интерфейса.

Я не уверен, упоминается ли он там, но DisconnectedState и его OperationLog могут быть сериализованы. Таким образом, его кэшированное состояние может сохраняться даже после перезапуска приложения.

1 голос
/ 17 марта 2010

Я не думаю, что кто-то реализует это в ядре NHibernate, потому что никто не будет его использовать. Viewmodel - это не та же модель, что и модель предметной области.

0 голосов
/ 17 мая 2012

EclipseLink имеет ограниченную поддержку для такого зверя. Они называют это «Соответствующим» и внедрили его в контекст «единицы работы».

0 голосов
/ 13 апреля 2010

Если вы все еще следите за этим, у Ayende Rahien есть статья в журнале MSDN http://msdn.microsoft.com/en-us/magazine/ee819139.aspx о подходе к сеансу на форму / докладчика. Также взгляните на главу 5 книги NHibernate http://manning.com/kuate/ (пример главы доступен), посвященной транзакциям и разговорам.

Пока вы задерживаете очистку / транзакцию до нажатия кнопки ok, она должна работать (в зависимости от режима очистки). Но полная изоляция - сложная задача, потому что ваш сеанс сможет получить доступ к данным, которые были зафиксированы другими сеансами при работе с несколькими объектами. Вам придется подумать о решении таких вопросов.

Кроме того, как бы вы справились с этой ситуацией, если вы не используете NHibernate?

0 голосов
/ 17 марта 2010

Это не прямой ответ на ваш вопрос, но именно такую ​​задачу WWF (должно любить имя) намеревался решить (не то, что он сделал это, по крайней мере, в версии 3.5).

...