Проблемы с активной записью / Nhibernate TransactionScopes - PullRequest
0 голосов
/ 27 июля 2010

Этот вопрос относится исключительно к AR.

Допустим, у меня в приложении web / wcf есть два слоя - DataLayer и BusinessLayer.DataLayer содержит почти атомарные операции, которые работают с отображениями (поиск, получение, сохранение, специальный поиск, перекрестный поиск и т. Д. :)).Существует много HQL или критериев.Там нет SessionScopes, используемые в этом слое.Некоторые из моих отображений содержат ленивые коллекции.

Теперь в слое BL есть методы, которые содержат бизнес-логику, смешанную с вызовами DL - это нормально.Для каждого открытого метода, в котором есть операции только для чтения, я указал SessionScope (FlushAction.Never).Для всех этих методов, в которых есть некоторые операции сохранения или обновления, я использую TransactionScope (), с try catch внутри, с прямым VoteCommit в конце метода и VoteRollback внутри предложения catch.Я установил ReadCommitted в качестве изолированного уровня.

Для базовых ситуаций это работает.У меня начались реальные проблемы, когда я писал методы, которые используют другие методы со своими собственными транзакциями внутри - я говорю о блокировках.Например, у меня есть метод с транзакцией, которая является рекурсивной.Похоже, что некоторые методы чтения (которые имеют свой собственный SessionScope (FlushAction.Never)) заблокированы из-за других транзакций.

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

Помощь на сайте замка мало что для менятакже тесты в источниках AR - они просто слишком базовые для меня.

Кто-нибудь может действительно объяснить, как я должен использовать TransactionScopes или в чем моя ошибка?

1 Ответ

1 голос
/ 27 июля 2010

Я рекомендую использовать Castle.Service.Transaction , это позволяет вам выполнять транзакции декларативно, а не явно.Обычно это используется через Автоматическое управление транзакциями , но для этого требуется Windsor .

...