Поделиться через


Управление транзакциями в службах объектов (платформа Entity Framework)

Службы объектов поддерживают автоматическое прикрепление транзакций. Это означает, что все действия, выполняемые в контексте объекта, например выполнение запросов и сохранение изменений в источнике данных, могут быть изолированы в источнике данных посредством выполнения операции внутри транзакции System.Transactions. Транзакции используются совместно со службами объектов для выполнения следующих задач.

  • Выполнение нескольких операций с источником данных, которые должны отличаться высокой согласованностью, например запросов, которые зависят от успешности изменения объектов.

  • Координации изменений контекста объекта с другими распределенными операциями, такими как отправка уведомлений по электронной почте или запись в очередь сообщений.

Транзакции, требующие прикрепления дополнительных диспетчеров ресурсов, называются распределенными транзакциями. Чтобы управлять ресурсами, необходимыми для завершения транзакции, распределенные транзакции используют координатор распределенных транзакций. Повышение транзакции до уровня координатора распределенных транзакций может быть довольно дорогостоящим процессом. Некоторые диспетчеры ресурсов, такие как SQL Server 2005, позволяют использовать протокол транзакций Promotable Single Phase Enlistment (PSPE). Это позволяет диспетчеру ресурсов хранить транзакцию, которая впоследствии может быть укрупнена для управления координатором распределенных транзакций.

Дополнительные сведения см. в разделе Обработка транзакций библиотеки MSDN.

При использовании транзакций со службами объектов необходимо учитывать следующие замечания.

  • В транзакции могут выполняться только операции, выполняемые в источнике данных. Изменения, внесенные в объекты в контексте объекта, в транзакции не включаются. Изменения объектов в контексте видимы вне области транзакции.

  • Если при вызове метода SaveChanges существует текущая транзакция, то службы объектов пользуются этой транзакцией для выполнения операций в источнике данных. Иначе службы создают новую транзакцию для этой операции. Определить транзакции можно с помощью элементов EntityTransaction, Transaction или TransactionScope.

    NoteПримечание.

    Чтобы выполнить прикрепление в существующей транзакции, службы объектов могут закрывать и повторно открывать соединение.

  • Когда службы объектов создают новую транзакцию для операции SaveChanges, изменения объектов в контексте объекта не принимаются до завершения этой транзакции. Это обеспечивает согласованность состояния контекста объекта и источника данных.

  • При планировании повторного выполнения операций в рамках транзакции необходимо убедиться, что состояние объектов в контексте не было сброшено до завершения транзакции. Для этого нужно вызвать метод SaveChanges со значением false для параметра acceptChangesDuringSave, а затем вызывать метод AcceptAllChanges лишь после успешного завершения других операций в рамках транзакции. Дополнительные сведения см. в разделе Как управлять транзакциями служб объектов (платформа Entity Framework).

  • При повторной попытке выполнить операцию с координируемыми транзакциями можно второй раз вызвать метод SaveChanges без предварительного вызова метода AcceptAllChanges. В этом случае службы объектов попытаются повторно применить те же изменения к источнику данных.

См. также

Основные понятия

Поставщик EntityClient для платформы Entity Framework
Управление соединениями в службах объектов (платформа Entity Framework)

Другие ресурсы

Управление контекстом объекта (платформа Entity Framework)