Atributos de transacción de ServiceModel
Windows Communication Foundation (WCF) proporciona las propiedades en tres atributos estándar System.ServiceModel que permiten configurar el comportamiento de las transacciones para un servicio WCF:
TransactionFlowAttribute
El atributo TransactionFlowAttribute especifica la predisposición de una operación en un contrato de servicio para aceptar las transacciones entrantes de un cliente. El atributo proporciona la propiedad siguiente a este control: las transacciones utilizan la enumeración TransactionFlowOption para especificar si una transacción entrante es Mandatory, Allowedo NotAllowed.
Éste es el único atributo que relaciona las operaciones de servicio con las interacciones externas con un cliente. Los atributos descritos en las siguientes secciones se relacionan con el uso de transacciones dentro de la ejecución de la operación.
ServiceBehaviorAttribute
El atributo ServiceBehaviorAttribute especifica el comportamiento de ejecución interno de una implementación de contrato de servicio. Entre las propiedades específicas de transacciones de este atributo se incluyen:
TransactionAutoCompleteOnSessionClose especifica si completar una transacción incompleta cuando la sesión se cierra. El valor predeterminado de esta propiedad es
false
. Si esta propiedad estrue
, y la sesión entrante se cerró correctamente en lugar de cerrarse debido a errores de red o de cliente, se completa correctamente cualquier transacción incompleta. De lo contrario, si esta propiedad esfalse
o si no se cerró la sesión correctamente, se deshace cualquier transacción incompleta cuando se cierra la sesión. Si esta propiedad estrue
, el canal de entrada debe basarse en sesión.ReleaseServiceInstanceOnTransactionComplete especifica si se libera la instancia del servicio subyacente cuando se completa una transacción. El valor predeterminado de esta propiedad es
true
. El siguiente mensaje entrante hace que se cree una nueva instancia subyacente, descartando cualquiera estado por transacción que la instancia anterior pudiese haber retenido. Liberar una instancia de servicio es una acción interna que realiza el servicio y no tiene ningún impacto en ninguna conexión ni sesiones existentes que los clientes puedan haber establecido. Esta funcionalidad es equivalente a la característica de activación just-in-time que proporciona COM+. Si la propiedad estrue
, ConcurrencyMode debe ser igual a Single. De lo contrario, el servicio produce una excepción de validación de configuración no válida durante el inicio.TransactionIsolationLevel especifica el nivel de aislamiento que se utilizará para las transacciones dentro del servicio; esta propiedad toma uno de los valores IsolationLevel. Si la propiedad de nivel de aislamiento local no es Unspecified, el nivel de aislamiento de una transacción entrante debe coincidir con el valor de esta propiedad local. De lo contrario, se rechaza la transacción entrante y se devuelve un error al cliente. Si TransactionScopeRequired es
true
, y no se fluye ninguna transacción, esta propiedad determina el valor IsolationLevel que se utilizará para la transacción creada localmente. Si se establece IsolationLevel como Unspecified, se usa IsolationLevelSerializable.TransactionTimeout especifica el período de tiempo dentro del que una nueva transacción creada en el servicio debe completarse. Si se alcanza este período de tiempo y no se ha completado la transacción, se anulará. TimeSpan se utiliza como tiempo de espera TransactionScope para cualquier operación que tenga TransactionScopeRequired destablecida como
true
y para la que se creó una nueva transacción. El tiempo de espera es la duración máxima permitida desde la creación de la transacción hasta la finalización de la fase 1 en el protocolo de confirmación de dos fases. El valor de tiempo de espera utilizado es siempre el valor inferior entre la propiedad TransactionTimeout y el valor de configuracióntransactionTimeout
.
OperationBehaviorAttribute
El atributo OperationBehaviorAttribute especifica los comportamientos de los métodos en la implementación del servicio. Puede utilizarlo para indicar el comportamiento de ejecución concreto de la operación. Las propiedades de este atributo no afectan a la descripción del lenguaje de descripción de servicios web (WSDL) del contrato de servicio y son simplemente elementos del modelo de programación WCF que habilitan características comunes que, de lo contrario, tendrían que implementar los desarrolladores.
Este atributo tiene las siguientes propiedades específicas de transacciones:
TransactionScopeRequired especifica si un método debe ejecutarse dentro de un ámbito de transacciones activo. El valor predeterminado es
false
. Si el atributo OperationBehaviorAttribute no se establece para un método, también implica que el método no se ejecutará en una transacción. Si no se requiere un ámbito de transacciones para una operación, cualquier transacción que esté presente dentro del encabezado del mensaje no se activa y permanece como un elemento de IncomingMessageProperties de OperationContext. Si se requiere un ámbito de la transacción para una operación, el origen para la transacción se deriva a partir de uno de los siguientes elementos:Si una transacción fluye a partir del cliente, se ejecuta el método bajo un ámbito de transacciones creado mediante esa transacción distribuida.
Con un transporte en cola, se usa la transacción utilizada para quitar el mensaje de la cola. Observe que la transacción utilizada no es una transacción de flujo, puesto que no la proporcionó el remitente original del mensaje.
Un transporte personalizado puede proporcionar una transacción mediante el uso de
TransportTransactionProperty
.Si nada de lo anterior proporciona un origen externo para una transacción, se crea inmediatamente una nueva instancia Transaction antes de llamar al método.
TransactionAutoComplete especifica si se completa automáticamente la transacción en la que se ejecuta el método si no se produce ninguna excepción no controlada. Si esta propiedad es
true
, la infraestructura de la llamada marca automáticamente la transacción como "completada" si el método de usuario vuelve sin producir una excepción. Si esta propiedad esfalse
, la transacción está adjunta a la instancia y solo se marca como "completada" si el cliente llama a un método subsiguiente marcado con esta propiedad igual atrue
, o si un método subsiguiente llama explícitamente a SetTransactionComplete. Error al realizar cualquiera de estos resultados en la transacción, que nunca se completa y no se confirma el trabajo contenido, a menos que la propiedad TransactionAutoCompleteOnSessionClose esté establecida comotrue
. Si esta propiedad se establece comotrue
, debe utilizar un canal con una sesión y InstanceContextMode debe establecerse como PerSession.