Sql Server Compact Edition параллелизм / безопасность потоков (т. Е. Не потокобезопасен) - PullRequest
5 голосов
/ 07 июня 2011

За последние несколько месяцев я впервые разрабатывал приложение, используя код 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 не может справиться с чем-то таким простым.Я имею в виду, что проблема не только в многопоточности - вы говорите, что она не может быть использована для веб-приложения, где два пользователя могут одновременно вставлять в таблицу ... INSANITY!

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

1 Ответ

2 голосов
/ 18 декабря 2011
...