Возможно ли поддерживать транзакцию со статическим LINQ to SQL DataContext в asp.net? - PullRequest
1 голос
/ 16 марта 2011

У меня есть приложение ASP.NET, которое связано с сервером SQL с помощью LINQ to SQL. Где у меня есть статический класс, конечно, он будет работать на уровне приложения. Где, как я создал статический объект DataContext в этом статическом классе. Я не создал ни одного объекта контекста данных в приложении, кроме этого. Где я использую этот статический объект контекста данных для каждой манипуляции с базой данных.

Так будет ли эта транзакция поддерживать потокобезопасность для каждого зарегистрированного пользователя?

Ответы [ 2 ]

10 голосов
/ 16 марта 2011

Примечание: следующий совет применим для всех инструментов O / RM, которые реализуют шаблон единиц работы, таких как Entity Framework ObjectContext, DbContext, NHibernate Session и LINQ to SQL DataContext.

LINQ to SQL DataContext НЕ является поточно-ориентированным.Вы должны создать (как минимум) 1 контекст для каждого веб-запроса.Повторное использование одного и того же экземпляра в нескольких потоках означает, что один поток может вызвать SubmitChanges, в то время как другой поток все еще вставляет новые объекты.Если вам повезет, DataContext сгенерирует исключение, потому что оно не может сохранить изменения.Если вам не повезло, DataContext завершается успешно, и вы нарушаете атомизацию одного запроса, что может привести к тому, что в вашей базе данных появятся противоречивые данные.Другими словами: у вас будет полная дерьмо база данных!

Кроме того, DataContext хранит все объекты в своем кэше, что означает, что потребление памяти вашим приложением будет расти, что может привести кдо OutOfMemoryException (OOM).И даже если вы не получите OOM, объекты в кэше устареют, особенно если другие приложения или процессы обновляют вашу базу данных, вы никогда не увидите эти изменения, когда объект уже находится в памяти.И последнее, что следует отметить, это то, что вы не можете откатить изменения, сделанные в DataContext, поэтому, когда вы (в какой-то момент) аннулировали DataContext (из-за ошибок), нет способа восстановить это (кромесоздание совершенно нового DataContext).В этом случае ваш AppDomain обречен.

0 голосов
/ 16 марта 2011

Ваше решение использовать один объект DataContext не является оптимальным.Создавайте их всякий раз, когда вам это нужно (транзакция).http://www.west -wind.com / блог / сообщений / 246222.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...