Dela via


Tjänster och transaktioner

Windows Communication Foundation-program (WCF) kan initiera en transaktion inifrån en klient och samordna transaktionen inom tjänståtgärden. Klienter kan initiera en transaktion och anropa flera tjänståtgärder och se till att tjänståtgärderna antingen checkas in eller återställs som en enda enhet.

Du kan aktivera transaktionsbeteendet i tjänstkontraktet genom att ange en ServiceBehaviorAttribute och ange dess TransactionIsolationLevel egenskaper och TransactionScopeRequired egenskaper för tjänståtgärder som kräver klienttransaktioner. Parametern TransactionAutoComplete anger om transaktionen där metoden körs slutförs automatiskt om inga ohanterade undantag utlöses. Mer information om dessa attribut finns i ServiceModel-transaktionsattribut.

Det arbete som utförs i tjänståtgärderna och hanteras av en resurshanterare, till exempel loggning av databasuppdateringar, är en del av klientens transaktion.

Följande exempel visar användningen av attributen ServiceBehaviorAttribute och OperationBehaviorAttribute för att styra transaktionsbeteendet på tjänstsidan.

[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]  
public class CalculatorService: ICalculatorLog  
{  
    [OperationBehavior(TransactionScopeRequired = true,  
                           TransactionAutoComplete = true)]  
    public double Add(double n1, double n2)  
    {  
        recordToLog($"Added {n1} to {n2}");
        return n1 + n2;  
    }  
  
    [OperationBehavior(TransactionScopeRequired = true,
                               TransactionAutoComplete = true)]  
    public double Subtract(double n1, double n2)  
    {  
        recordToLog($"Subtracted {n1} from {n2}");
        return n1 - n2;  
    }  
  
    [OperationBehavior(TransactionScopeRequired = true,
                                       TransactionAutoComplete = true)]  
    public double Multiply(double n1, double n2)  
    {  
        recordToLog($"Multiplied {n1} by {n2}");
        return n1 * n2;  
    }  
  
    [OperationBehavior(TransactionScopeRequired = true,
                                       TransactionAutoComplete = true)]  
    public double Divide(double n1, double n2)  
    {  
        recordToLog($"Divided {n1} by {n2}", n1, n2);
        return n1 / n2;  
    }  
  
}  

Du kan aktivera transaktioner och transaktionsflöde genom att konfigurera klient- och tjänstbindningarna så att de använder WS-AtomicTransaction-protokollet och ange <transactionFlow-elementet> till true, enligt följande exempelkonfiguration.

<client>  
    <endpoint address="net.tcp://localhost/ServiceModelSamples/service"
          binding="netTcpBinding"
          bindingConfiguration="netTcpBindingWSAT"
          contract="Microsoft.ServiceModel.Samples.ICalculatorLog" />  
</client>  
  
<bindings>  
    <netTcpBinding>  
        <binding name="netTcpBindingWSAT"  
                transactionFlow="true"  
                transactionProtocol="WSAtomicTransactionOctober2004" />  
     </netTcpBinding>  
</bindings>  

Klienter kan starta en transaktion genom att skapa en TransactionScope och anropa tjänståtgärder inom transaktionens omfång.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))  
{  
    //Do work here  
    ts.Complete();  
}  

Se även