Вот что мы пробовали с тех пор:
- Написал наш собственный TransactionScope (унаследованный от ITransactionScope), который:
- Открывает
ActiveRecord.TransactionScope
в Commit , а не в ctor
(задерживает транзакцию до тех пор, пока не потребуется)
- Открывает 'SessionScope' в
ctor
, если ни один не доступен (в качестве защиты)
- Преобразовал наши идентификаторы в Guid из идентичности
- Это остановило автоматическую очистку
insert
/ update
вне транзакции (!)
Теперь у нас есть следующее поведение приложения:
- Запрос от MVC
SELECT
s, необходимых службам, запускаются, все за пределами транзакции
Repository.Add
вызовы не попадают в базу данных, пока в наших контроллерах не будет вызван scope.Commit
- Все
INSERT
с / UPDATE
с происходят внутри транзакции как атомарная единица, без SELECT
с.
... Но по какой-то причине nHProf сейчас! = SqlProfiler (кажется, select
s происходит в БД до того, как nHProf сообщит об этом).
Примечание
Прежде чем я разгорячился, я осознаю проблемы здесь и знаю, что SELECT не включены в транзакцию. Это дизайн. Некоторые из наших операций будут содержать SELECT (теперь у нас есть пара наших собственных реализаций TransactionScope
) в сериализованных транзакциях. Подавляющему большинству нашего кода не нужны самые свежие данные, и мы сериализовали рабочие нагрузки с отдельными операторами.
ТАКЖЕ
Если кто-то знает, как получить обновленный столбец идентификации (не PK) после insert
без необходимости вручную обновлять объект, в частности, используя разметку ActiveRecord (я думаю, что это возможно в файлах отображения nHibernate с использованием «сгенерированного») атрибут) пожалуйста дайте мне знать !!