Använda System.Transactions
gäller för:SQL Server
System.Transactions
-namnområdet tillhandahåller ett transaktionsramverk som är helt integrerat med ADO.NET och SQL Server common language runtime-integrering (CLR). Klassen System.Transactions.TransactionScope
gör ett kodblock transaktionellt genom att implicit registrera anslutningar i en distribuerad transaktion. Du måste anropa metoden Complete
i slutet av kodblocket som markeras av TransactionScope
. Metoden Dispose
anropas när programkörningen lämnar ett kodblock, vilket gör att transaktionen avbryts om Complete
-metoden inte anropas. Om ett undantag utlöstes som gör att koden lämnar omfånget anses transaktionen avbrytas.
Vi rekommenderar att du använder ett using
-block för att säkerställa att Dispose
-metoden anropas på TransactionScope
-objektet när using
-blocket avslutas. Om det inte går att checka in eller återställa väntande transaktioner kan prestandan försämras allvarligt eftersom standardtidsgränsen för TransactionScope
är en minut. Om du inte använder en using
-instruktion måste du utföra allt arbete i ett Try
-block och uttryckligen anropa metoden Dispose
i Finally
-blocket.
Om ett undantag inträffar inom TransactionScope
markeras transaktionen som inkonsekvent och avbryts. Den återställs när TransactionScope
tas bort. Om inget undantag inträffar genomför deltagande transaktioner.
TransactionScope
bör endast användas när lokala och fjärranslutna datakällor eller externa resurshanterare används, eftersom TransactionScope
alltid gör att transaktioner höjs upp, även om de endast används inom en kontextanslutning.
Klassen TransactionScope
skapar en transaktion med en System.Transactions.Transaction.IsolationLevel
av Serializable
som standard. Beroende på ditt program kanske du vill överväga att sänka isoleringsnivån för att undvika hög konkurrens i ditt program.
Not
Vi rekommenderar att du endast utför uppdateringar, infogningar och borttagningar i distribuerade transaktioner mot fjärrservrar eftersom de förbrukar betydande databasresurser. Om åtgärden ska utföras på den lokala servern är en distribuerad transaktion inte nödvändig och en lokal transaktion räcker.
SELECT
-instruktioner kan låsa databasresurser i onödan, och i vissa scenarier kan det vara nödvändigt att använda transaktioner för val. Allt arbete som inte är databasarbete bör utföras utanför transaktionens omfång, såvida det inte omfattar andra transacted-resurshanterare.
Även om ett undantag inom transaktionens omfång hindrar transaktionen från att genomföras, har klassen TransactionScope
ingen bestämmelse för att återställa eventuella ändringar som koden gör utanför själva transaktionens omfång. Om du behöver vidta åtgärder när transaktionen återställs måste du skriva en egen implementering av System.Transactions.IEnlistmentNotification
-gränssnittet och uttryckligen registrera dig i transaktionen.
Exempel
Om du vill arbeta med System.Transactions
måste du ha en referens till filen System.Transactions.dll.
Följande kod visar hur du skapar en transaktion som kan höjas upp mot två olika instanser av SQL Server. Dessa instanser representeras av två olika System.Data.SqlClient.SqlConnection
objekt, som omsluts i ett TransactionScope
block. Koden skapar TransactionScope
-blocket med en using
-instruktion och öppnar den första anslutningen, som automatiskt registrerar den i TransactionScope
. Transaktionen registreras ursprungligen som en enkel transaktion, inte som en fullständig distribuerad transaktion. Koden förutsätter att det finns villkorsstyrd logik (utelämnas för korthet). Den öppnar den andra anslutningen endast om den behövs och registrerar den i TransactionScope
.
När anslutningen öppnas höjs transaktionen automatiskt till en fullständig distribuerad transaktion. Koden anropar sedan TransactionScope.Complete
, som genomför transaktionen. Koden gör sig av med de två anslutningarna när du avslutar using
-instruktionerna för anslutningarna. Metoden TransactionScope.Dispose
för TransactionScope
anropas automatiskt när using
-blocket avslutas för TransactionScope
. Om ett undantag utlöstes någon gång i TransactionScope
-blocket anropas inte Complete
och den distribuerade transaktionen återställs när TransactionScope
tas bort.
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();
}