Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Propiedad OperationBehaviorAttribute.TransactionScopeRequired

 

Publicado: octubre de 2016

Obtiene o establece un valor que indica si el método requiere un ámbito de la transacción para su ejecución.

Espacio de nombres:   System.ServiceModel
Ensamblado:  System.ServiceModel (en System.ServiceModel.dll)

public bool TransactionScopeRequired { get; set; }

Valor de propiedad

Type: System.Boolean

true si el método exige que un ámbito de la transacción se ejecute; de lo contrario, false. De manera predeterminada, es false.

Establezca TransactionScopeRequired en true para exigir que su operación se ejecute dentro de un ámbito de la transacción. Si una transacción de flujo está disponible, la operación se ejecuta dentro de esa transacción. Si ninguna está disponible, se crea una nueva transacción y se utiliza para la ejecución de la operación. El enlace especificado en el extremo controla si se admiten las transacciones de flujo. Por consiguiente, para obtener el comportamiento apropiado debe entender la interacción entre si el enlace y la propiedad TransactionScopeRequired permiten el flujo de transacciones. En la siguiente tabla se muestra el posible comportamiento.

TransactionScopeRequired

El enlace permite el flujo de transacciones

El autor de la llamada fluye la transacción

Resultado

False

False

No

El método se ejecuta sin una transacción.

True

False

No

El método se crea y se ejecuta dentro de una nueva transacción.

True o False

False

Si

Se devuelve un error de SOAP para el encabezado de transacción.

False

True

Si

El método se ejecuta sin una transacción.

True

True

Si

El método se ejecuta bajo la transacción fluida.

El ejemplo de código siguiente muestra una operación que se ejecuta dentro de una transacción distribuida obligatoria. La propiedad TransactionScopeRequired indica que la operación se ejecuta bajo un ámbito de la transacción, y la propiedad TransactionAutoComplete indica que, si no se produce ninguna excepción no controlada, se completa el ámbito de la transacción automáticamente. Si se produce una excepción no controlada, se anula la transacción.

using System;
using System.ServiceModel;
using System.Transactions;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(Namespace="http://microsoft.wcf.documentation", SessionMode=SessionMode.Required)]
  public interface IBehaviorService
  {
    [OperationContract]
    string TxWork(string message);
  }

  // Note: To use the TransactionIsolationLevel property, you 
  // must add a reference to the System.Transactions.dll assembly.
  /* The following service implementation:
   *   -- Processes messages on one thread at a time
   *   -- Creates one service object per session
   *   -- Releases the service object when the transaction commits
   */
  [ServiceBehavior(
    ConcurrencyMode=ConcurrencyMode.Single,
    InstanceContextMode=InstanceContextMode.PerSession,
    ReleaseServiceInstanceOnTransactionComplete=true
  )]
  public class BehaviorService : IBehaviorService, IDisposable
  {
    Guid myID;

    public BehaviorService()
    {
      myID = Guid.NewGuid();
      Console.WriteLine(
        "Object "
        + myID.ToString()
        + " created.");
    }

    /*
     * The following operation-level behaviors are specified:
     *   -- Always executes under a transaction scope.
     *   -- The transaction scope is completed when the operation terminates 
     *       without an unhandled exception.
     */
    [OperationBehavior(
      TransactionAutoComplete = true,
      TransactionScopeRequired = true
    )]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    public string TxWork(string message)
    {
      // Do some transactable work.
      Console.WriteLine("TxWork called with: " + message);
      // Display transaction information.

      TransactionInformation info = Transaction.Current.TransactionInformation;
      Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier);
      Console.WriteLine("The tx status: {0}.", info.Status);
      return String.Format("Hello. This was object {0}.",myID.ToString()) ;
    }

    public void Dispose()
    {
      Console.WriteLine(
        "Service "
        + myID.ToString()
        + " is being recycled."
      );
    }
  }
}

.NET Framework
Disponible desde 3.0
Volver al principio
Mostrar: