Sql Server Compact Edition параллелизм / безопасность потоков (т. Е. Не потокобезопасность)

За последние несколько месяцев я впервые разрабатывал приложение с использованием кода Entity Framework и sql server CE. Я нашел комбинацию этих двух очень полезной, и по сравнению с моим старым способом работы (особенно с ADO.NET) она позволяет безумно сократить время разработки.

Однако сегодня утром я и некоторые коллеги столкнулись с проблемой, которую мы никогда не видели ни в какой документации по SqlServer CE. Он не может обрабатывать более одной вставки одновременно!

Я считал, что CE может стать моей предпочтительной базой данных, пока я не столкнулся с этой проблемой. Причина, по которой я обнаружил это, заключалась в моем приложении, которое мне нужно было сделать сразу несколько запросов к веб-службе, и это создавало узкое место, поэтому я продолжил использовать вызов Parallel.Invoke для выполнения нескольких запросов.

Все работало нормально, пока я не включил службу регистрации сообщений приложений. На этом этапе я начал получать следующую ошибку при выполнении веб-запросов:

A duplicate value cannot be inserted into a unique index. [ Table name = Accounts,Constraint name = PK__Accounts__0000000000000016 ]
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlServerCe.SqlCeException: A duplicate value cannot be inserted into a unique index. [ Table name = Accounts,Constraint name = PK__Accounts__0000000000000016 ]

«Странно, - подумал я. И мое первое замечание заключалось в том, что это должно быть связано с DbContext, возможно, DbContext, который я использовал, был статическим или что-то еще в моем классе Repository было статическим и вызывало проблему, но после того, как я понюхал, я убедился, что это не имеет никакого отношения с моим кодом.

Затем я обратил на это внимание моих коллег, и через некоторое время было решено, что это должен быть SqlServer CE, и после того, как мы все настроили разные тестовые проекты, пытаясь воссоздать проблему с помощью потоков, она воссоздалась почти каждый раз, а при использовании Sql Server Express: проблема не возникла.

Мне просто кажется немного странным, что CE не может справиться с чем-то таким простым. Я имею в виду, что проблема не только в потоковой передаче - вы говорите мне, что ее нельзя использовать для веб-приложения, где два пользователя могут одновременно вставлять в таблицу ... БЕЗУМИЕ!

В любом случае, просто интересно, столкнулся ли кто-нибудь еще так поздно с проектом, как я, и был шокирован (и раздражен) тем, что он работает таким образом? Также было бы круто, если бы кто-нибудь мог пролить свет на то, почему он ограничен таким образом.


person jcvandan    schedule 07.06.2011    source источник
comment
Все ли ваши потоки используют один и тот же экземпляр соединения, то есть отдельные DBContexts, но используют один и тот же объект соединения? Если да, пробовали ли вы подключение по потоку?   -  person Ben Robinson    schedule 07.06.2011
comment
Я не создаю объект подключения - я использую conv over conf, строка подключения в конфигурации соответствует имени моего DbContext, поэтому он автоматически создает свой собственный conn obj   -  person jcvandan    schedule 07.06.2011
comment
Я не знаю, как EF управляет соединениями под капотом, если вы делаете это таким образом, возможно, что он использует то же соединение за кулисами (например, с использованием одноэлементного шаблона). Я думаю, что у ObjectContext есть конструктор, который позволяет вам передавать ваше собственное соединение. Попробуйте, чтобы увидеть, решит ли это проблему.   -  person Ben Robinson    schedule 07.06.2011
comment
Как создается ваш уникальный ключ?   -  person Ladislav Mrnka    schedule 07.06.2011
comment
@Ladislav Entity Framework заботится о ключе, это просто целочисленное свойство Id в моем объекте POCO, первичный ключ в db - это просто стандартный автоматически увеличиваемый первичный ключ, который сопоставляется со свойством Id объекта   -  person jcvandan    schedule 07.06.2011
comment
@Ben - Я посмотрю, не вызывает ли это проблема   -  person jcvandan    schedule 07.06.2011


Ответы (1)


Похоже на ошибку в SQL CE. См. http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=641518

person Serghei Gorodetki    schedule 18.12.2011