Я автоматически волнуюсь, как только люди начинают упоминать «транзакция» и «сессия» в одном предложении. По моему мнению и опыту, он просто не подходит для учета нескольких вызовов WCF для одной транзакционной единицы работы:
- это означает, что ваша блокировка зависит от внешнего клиента
- большой потенциал для неразрешимых взаимоблокировок - то есть, которые могут быть только тайм-аутом, а не db-центрированными взаимоблокировками, которые могут быть обнаружены
- Вы вынуждены использовать липкую балансировку нагрузки
Лично я бы попытался работать над одной единицей работы. Это может означать, что клиент упаковывает запрос complete и отправляет его как элементарную операцию, или это может означать, что вы делаете это отдельно через сеанс - т.е. вы буферизуете «что» в нескольких вызовах, но только начинайте что-то делать, когда у вас есть все, что вам нужно.
В любом случае, в итоге вы получите единицу работы, работающую в одной реализации, что должно обеспечить нормальную работу либо транзакций db, либо окружающих (TransactionScope
) транзакций. Преимущество окружающей транзакции (в вашем сценарии) состоит в том, что она будет работать в нескольких контекстах данных, но я ожидаю, что должна быть возможность исправить вызов Single
(согласно соответствующему вопросу) без слишком большой головной боли.
Или дождитесь .NET 4.0, когда я буду уверен, что ошибка устранена. Хорошо, это последнее, вероятно, бесполезно в краткосрочной перспективе ...