OperationBehaviorAttribute.TransactionScopeRequired Propriedade
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Recebe ou define um valor que indica se o método requer um âmbito de transação para a sua execução.
public:
property bool TransactionScopeRequired { bool get(); void set(bool value); };
public bool TransactionScopeRequired { get; set; }
member this.TransactionScopeRequired : bool with get, set
Public Property TransactionScopeRequired As Boolean
Valor de Propriedade
true se o método exigir um âmbito de transação para ser executado; caso contrário, false. A predefinição é false.
Exemplos
O seguinte exemplo de código mostra uma operação que é executada dentro de uma transação distribuída obrigatória. A TransactionScopeRequired propriedade indica que a operação é executada sob um âmbito de transação e a TransactionAutoComplete propriedade indica que, se não ocorrerem exceções não tratadas, o âmbito da transação é concluído automaticamente. Se ocorrer uma exceção não tratada, a transação é abortada.
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."
);
}
}
}
Imports System.ServiceModel
Imports System.Transactions
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation", SessionMode:=SessionMode.Required)> _
Public Interface IBehaviorService
<OperationContract> _
Function TxWork(ByVal message As String) As String
End Interface
' 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
Implements IBehaviorService, IDisposable
Private myID As Guid
Public Sub New()
myID = Guid.NewGuid()
Console.WriteLine("Object " & myID.ToString() & " created.")
End Sub
'
' * 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 Function TxWork(ByVal message As String) As String Implements IBehaviorService.TxWork
' Do some transactable work.
Console.WriteLine("TxWork called with: " & message)
' Display transaction information.
Dim info As TransactionInformation = 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())
End Function
Public Sub Dispose() Implements IDisposable.Dispose
Console.WriteLine("Service " & myID.ToString() & " is being recycled.")
End Sub
End Class
End Namespace
Observações
Defina o TransactionScopeRequired to true para exigir que a sua operação seja executada dentro do âmbito de uma transação. Se houver uma transação fluída disponível, a operação é executada dentro dessa transação. Se não estiver disponível, uma nova transação é criada e usada para a execução da operação. A ligação especificada no endpoint controla se as transações fluxadas são suportadas. Portanto, para obter o comportamento adequado, é necessário compreender a interação entre se o fluxo de transações é permitido pela vinculação e a TransactionScopeRequired propriedade. A tabela seguinte mostra o comportamento possível.
| NecessárioÂmbitoDeTransação | A vinculação permite o fluxo de transações | Transação de fluxos de chamadas | Result |
|---|---|---|---|
| Falso | Falso | No | O método executa-se sem transação. |
| Verdade | Falso | No | O método cria e executa dentro de uma nova transação. |
| Verdadeiro ou Falso | Falso | Yes | É devolto um erro SOAP para o cabeçalho da transação. |
| Falso | Verdade | Yes | O método executa-se sem transação. |
| Verdade | Verdade | Yes | O método executa-se sob a transação fluída. |