System.Transactions gebruiken
van toepassing op:SQL Server-
De System.Transactions
-naamruimte biedt een transactieframework dat volledig is geïntegreerd met ADO.NET- en CLR-integratie (Common Language Runtime) van SQL Server. De System.Transactions.TransactionScope
-klasse maakt een codeblok transactioneel door impliciet verbindingen in te schakelen in een gedistribueerde transactie. U moet de Complete
methode aanroepen aan het einde van het codeblok dat is gemarkeerd door de TransactionScope
. De methode Dispose
wordt aangeroepen wanneer programma-uitvoering een codeblok verlaat, waardoor de transactie wordt stopgezet als de Complete
methode niet wordt aangeroepen. Als er een uitzondering is opgetreden die ervoor zorgt dat de code het bereik verlaat, wordt de transactie als stopgezet beschouwd.
U wordt aangeraden een using
blok te gebruiken om ervoor te zorgen dat de methode Dispose
wordt aangeroepen op het TransactionScope
-object wanneer het using
blok wordt afgesloten. Als u transacties die in behandeling zijn niet doorvoert of terugdraait, kunnen de prestaties ernstig afnemen, omdat de standaardtime-out voor de TransactionScope
één minuut is. Als u geen using
-instructie gebruikt, moet u alle werkzaamheden uitvoeren in een Try
blok en de Dispose
methode expliciet aanroepen in het Finally
blok.
Als er een uitzondering optreedt in de TransactionScope
, wordt de transactie gemarkeerd als inconsistent en wordt deze afgelaten. Het wordt teruggedraaid wanneer de TransactionScope
wordt verwijderd. Als er geen uitzondering optreedt, voeren deelnemende transacties door.
TransactionScope
mag alleen worden gebruikt wanneer lokale en externe gegevensbronnen of externe resourcemanagers worden geopend, omdat TransactionScope
altijd transacties veroorzaakt, zelfs als deze alleen binnen een contextverbinding worden gebruikt.
De klasse TransactionScope
maakt standaard een transactie met een System.Transactions.Transaction.IsolationLevel
van Serializable
. Afhankelijk van uw toepassing kunt u overwegen het isolatieniveau te verlagen om conflicten in uw toepassing te voorkomen.
Notitie
U wordt aangeraden alleen updates, invoegingen en verwijderingen uit te voeren binnen gedistribueerde transacties op externe servers, omdat ze aanzienlijke databasebronnen verbruiken. Als de bewerking wordt uitgevoerd op de lokale server, is een gedistribueerde transactie niet nodig en volstaat een lokale transactie.
SELECT
instructies kunnen databasebronnen onnodig vergrendelen en in sommige scenario's is het mogelijk nodig om transacties voor selecties te gebruiken. Alle niet-databasewerkzaamheden moeten buiten het bereik van de transactie worden uitgevoerd, tenzij er andere transacted resourcemanagers betrokken zijn.
Hoewel een uitzondering binnen het bereik van de transactie voorkomt dat de transactie wordt doorgevoerd, heeft de TransactionScope
-klasse geen inrichting voor het terugdraaien van wijzigingen die uw code aanbrengt buiten het bereik van de transactie zelf. Als u actie moet ondernemen wanneer de transactie wordt teruggedraaid, moet u uw eigen implementatie van de System.Transactions.IEnlistmentNotification
-interface schrijven en expliciet in de transactie opnemen.
Voorbeelden
Als u met System.Transactions
wilt werken, moet u een verwijzing naar het System.Transactions.dll-bestand hebben.
De volgende code laat zien hoe u een transactie maakt die kan worden gepromoveerd op twee verschillende exemplaren van SQL Server. Deze exemplaren worden vertegenwoordigd door twee verschillende System.Data.SqlClient.SqlConnection
objecten, die zijn verpakt in een TransactionScope
blok. De code maakt het TransactionScope
blok met een using
-instructie en opent de eerste verbinding, die deze automatisch in de TransactionScope
opgeeft. De transactie wordt in eerste instantie als een lichtgewicht transactie ingeschreven, niet als een volledige gedistribueerde transactie. In de code wordt ervan uitgegaan dat er voorwaardelijke logica bestaat (weggelaten voor beknoptheid). De tweede verbinding wordt alleen geopend als deze nodig is, en deze in de TransactionScope
op te halen.
Wanneer de verbinding wordt geopend, wordt de transactie automatisch gepromoveerd naar een volledige gedistribueerde transactie. De code roept vervolgens TransactionScope.Complete
aan, waarmee de transactie wordt doorgevoerd. De code verwijdert de twee verbindingen bij het afsluiten van de using
-instructies voor de verbindingen. De TransactionScope.Dispose
methode voor de TransactionScope
wordt automatisch aangeroepen bij beëindiging van het using
blok voor de TransactionScope
. Als er op enig moment in het TransactionScope
blok een uitzondering is opgetreden, wordt Complete
niet aangeroepen en wordt de gedistribueerde transactie teruggedraaid wanneer de TransactionScope
wordt verwijderd.
using (TransactionScope transScope = new TransactionScope())
{
using (SqlConnection connection1 = new
SqlConnection(connectString1))
{
// Opening connection1 automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open();
// Do work in the first connection.
// Assumes conditional logic in place where the second
// connection will only be opened as needed.
using (SqlConnection connection2 = new
SqlConnection(connectString2))
{
// Open the second connection, which enlists the
// second connection and promotes the transaction to
// a full distributed transaction.
connection2.Open();
// Do work in the second connection.
}
}
// The Complete method commits the transaction.
transScope.Complete();
}