Является ли EF4 ObjectContext.SaveChanges потокобезопасным? - PullRequest
0 голосов
/ 13 декабря 2011

Я обращаюсь к своей базе данных через Entity Framework 4.

У меня есть сервер, который прослушивает порт, ожидая некоторых сообщений.Когда приходит сообщение, оно переводится в строку таблицы и должно быть вставлено в базу данных.Тем не менее, несколько сообщений могут приходить одновременно.Для каждого сообщения я создаю задачу (из TPL) и выполняю ее асинхронно.

Каждая из этих задач создает экземпляр ObjectContext, создает объект соответствующего класса сущности (представляет таблицу в БД), вставляетданные в ObjectContext, а затем вызывает метод SaveChanges.

Таким образом, каждый поток создал свой собственный ObjectContext.Может ли экземпляр ObjectContext влиять на любой другой экземпляр ObjectContext?Будет ли у этого сценария побочные эффекты?

(обратите внимание, что вставленные данные не приведут к ошибке ссылочной целостности).

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

В вашей ситуации целостность транзакций гарантируется базой данных (SQL Server), а не Entity Framework. Поскольку каждый поток имеет свой собственный контекст, вам не нужно беспокоиться о том, что SaveChanges() каждого контекста мешает другому.

Один экземпляр ObjectContext не может влиять на другой. Вы можете столкнуться с ситуацией, когда один SaveChanges() изменяет базу данных таким образом, что последующий SaveChanges() в другом контексте не срабатывает. Но это сделано намеренно и, опять же, является результатом применения SQL Server своих ограничений.

1 голос
/ 13 декабря 2011

Контекст данных обычно не является потокобезопасным; но поскольку они все независимы (по запросу), это не проблема.

Чрезмерно упрощенный ответ - «нет» в том смысле, что контексты не связаны. Однако все, что говорит с базой данных, может иметь граничные условия, в зависимости от того, какие запросы вы выполняете до SaveChanges, и от того, оказываются ли какие-либо фантомные или неповторяющиеся операции чтения, или если что-то обновляет данные, которые имеют также был обновлен другим запросом или выполнял 2 вставки для разных запросов, что индивидуально было бы хорошо, но в комбинации нарушало бы уникальное ограничение и т. Д.

...