Этот вопрос относится исключительно к 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 или в чем моя ошибка?