Administrar transacciones en Servicios de objeto (Entity Framework)
Servicios de objeto admite la inscripción automática en transacciones. Esto significa que las actividades realizadas dentro de un contexto del objeto, como ejecutar consultas y guardar los cambios de los datos en el origen de datos, se pueden aislar en dicho origen de datos ejecutando la operación dentro de una transacción System.Transactions. Las transacciones se utilizan con Servicios de objeto para lo siguiente:
Ejecutar varias operaciones en el origen de datos; estas deben ser coherentes, como realizar consultas que dependan de la realización correcta de cambios en los objetos.
Coordinar los cambios en el contexto del objeto con otras operaciones distribuidas, como enviar una notificación de correo electrónico o escribir en una cola de mensajes.
Las transacciones que requieren la inscripción de administradores de recursos adicionales se denominan transacciones distribuidas. Las transacciones distribuidas utilizan un coordinador de transacciones distribuidas (DTC) para administrar los recursos que se necesitan para completar la transacción. La promoción de una transacción a un DTC puede ser un proceso relativamente difícil de establecer y completar. Algunos administradores de recursos, como SQL Server 2005, admiten el protocolo de transacciones PSPE (Promotable Single Phase Enlistment). Esto permite a un administrador de recursos hospedar una transacción que se pueda escalar posteriormente para ser administrada por el coordinador de transacciones distribuidas (DTC), si es necesario.
Para obtener más información vea Transaction Processing en MSDN Library.
Las consideraciones siguientes son aplicables cuando se utilizan transacciones con Servicios de objeto:
Sólo las operaciones con el origen de datos son susceptibles de transacción. Los cambios realizados en los objetos del contexto del objeto no son susceptibles de transacción. Los cambios efectuados en objetos del contexto están visibles fuera del ámbito de la transacción.
Al llamar a SaveChanges, si existe una transacción actual, Servicios de objeto utiliza esta transacción para las operaciones realizadas con el origen de datos. De lo contrario, crea una transacción nueva para la operación. Puede definir transacciones utilizando EntityTransaction, Transaction o TransactionScope.
Nota Para dar de alta una transacción existente, Servicios de objeto puede cerrar y volver a abrir la conexión.
Cuando Servicios de objeto crea una transacción nueva para una operación SaveChanges, los cambios efectuados en los objetos del contexto del objeto no se aceptan hasta que se complete la transacción. De este modo, se garantiza que el estado del contexto del objeto y el origen de datos son coherentes.
Si tiene previsto volver a intentar operaciones en una transacción, debe asegurarse de que el estado de los objetos del contexto no se establezca de nuevo antes de completarse la transacción. Para ello, debe llamar a SaveChanges con el valor false para el parámetro acceptChangesDuringSave y, a continuación, llamar a AcceptAllChanges únicamente después de que otras operaciones de la transacción se hayan completado de forma correcta. Para obtener más información, vea Cómo administrar transacciones de Servicios de objeto (Entity Framework).
Como parte de una operación de reintento con transacciones coordinadas, puede llamar a SaveChanges una segunda vez sin llamar primero a AcceptAllChanges. En este caso, Servicios de objeto intentará volver a aplicar los mismos cambios en el origen de datos.
Vea también
Conceptos
Proveedor de EntityClient para Entity Framework
Administrar conexiones en Servicios de objeto (Entity Framework)