Транзакция хранится в сеансе?OMG ...
Стоп! Хранение транзакции в сессии - ужасно неправильная идея.Вернитесь к своему анализу и измените архитектуру сейчас .
Почему?Предположим, что ваше приложение используется более чем одним пользователем (да, обычно это происходит для приложений ASP.NET).Теперь первый пользователь помечает изменение данных в вашей длительной транзакции.Транзакция действительно связывается с базой данных и использует блокировки для записей.Поэтому после первого незафиксированного изменения транзакция заблокировала некоторую запись.Теперь каждый запрос от другого пользователя / транзакции, который будет пытаться получить доступ к той же записи, будет ждать, пока транзакция модификации не будет завершена (если вы не разрешите чтение незафиксированных данных, что почти не отличается от использования транзакций вообще).Если транзакция модификации занимает 10 минут, все другие пользователи, имеющие доступ к той же записи, будут иметь тайм-аут.
Это всего лишь один пример, почему это совершенно неверная идея.Это, в частности, высокая вероятность возникновения «мертвых» блокировок, проблемы с производительностью на сервере SQL, тайм-ауты транзакций и т. Д.
Что еще хуже, ваша транзакция распределена, поэтому я почему-то сомневаюсь, что она может работать, поскольку используются соединения из всех контекстных экземпляровв транзакции должен быть активен, когда вы решите зафиксировать, и до тех пор, пока вы не подтвердите, они не должны быть уничтожены или сброшены (возвращены в пул соединений).
Это делается совершенно другим способом:
Storeобъекты в сеансе и отправка их в базу данных, когда пользователь завершает все изменения - сам SaveChanges использует транзакцию, поэтому, если вы сохраняете изменения вместе, они будут в транзакции, и до тех пор, пока пользователь не завершит изменения, нет причин их сохранять.Имейте в виду, что это не означает сохранение контекста в сеансе!
Долгосрочные транзакции действительно существуют, но они «реализованы на заказ».Это означает, что данные сохраняются в базе данных как без транзакции, и у вас есть отдельный код, называемый компенсацией, который может отменить изменения.Это то, что вам не нужно в этом сценарии.