TransactionScope Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Gör ett kodblock transaktionellt. Det går inte att ärva den här klassen.
public ref class TransactionScope sealed : IDisposable
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public sealed class TransactionScope : IDisposable
public sealed class TransactionScope : IDisposable
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
type TransactionScope = class
interface IDisposable
type TransactionScope = class
interface IDisposable
Public NotInheritable Class TransactionScope
Implements IDisposable
- Arv
-
TransactionScope
- Attribut
- Implementeringar
Exempel
I följande exempel visas hur du använder TransactionScope klassen för att definiera ett kodblock för att delta i en transaktion.
// This function takes arguments for 2 connection strings and commands to create a transaction
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
// transaction is rolled back. To test this code, you can connect to two different databases
// on the same server by altering the connection string, or to another 3rd party RDBMS by
// altering the code in the connection2 code block.
static public int CreateTransactionScope(
string connectString1, string connectString2,
string commandText1, string commandText2)
{
// Initialize the return value to zero and create a StringWriter to display results.
int returnValue = 0;
System.IO.StringWriter writer = new System.IO.StringWriter();
try
{
// Create the TransactionScope to execute the commands, guaranteeing
// that both commands can commit or roll back as a single unit of work.
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection1 = new SqlConnection(connectString1))
{
// Opening the connection automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open();
// Create the SqlCommand object and execute the first command.
SqlCommand command1 = new SqlCommand(commandText1, connection1);
returnValue = command1.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command1: {0}", returnValue);
// If you get here, this means that command1 succeeded. By nesting
// the using block for connection2 inside that of connection1, you
// conserve server and network resources as connection2 is opened
// only when there is a chance that the transaction can commit.
using (SqlConnection connection2 = new SqlConnection(connectString2))
{
// The transaction is escalated to a full distributed
// transaction when connection2 is opened.
connection2.Open();
// Execute the second command in the second database.
returnValue = 0;
SqlCommand command2 = new SqlCommand(commandText2, connection2);
returnValue = command2.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
}
}
// The Complete method commits the transaction. If an exception has been thrown,
// Complete is not called and the transaction is rolled back.
scope.Complete();
}
}
catch (TransactionAbortedException ex)
{
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
}
// Display messages.
Console.WriteLine(writer.ToString());
return returnValue;
}
' This function takes arguments for 2 connection strings and commands to create a transaction
' involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
' transaction is rolled back. To test this code, you can connect to two different databases
' on the same server by altering the connection string, or to another 3rd party RDBMS
' by altering the code in the connection2 code block.
Public Function CreateTransactionScope( _
ByVal connectString1 As String, ByVal connectString2 As String, _
ByVal commandText1 As String, ByVal commandText2 As String) As Integer
' Initialize the return value to zero and create a StringWriter to display results.
Dim returnValue As Integer = 0
Dim writer As System.IO.StringWriter = New System.IO.StringWriter
Try
' Create the TransactionScope to execute the commands, guaranteeing
' that both commands can commit or roll back as a single unit of work.
Using scope As New TransactionScope()
Using connection1 As New SqlConnection(connectString1)
' Opening the connection automatically enlists it in the
' TransactionScope as a lightweight transaction.
connection1.Open()
' Create the SqlCommand object and execute the first command.
Dim command1 As SqlCommand = New SqlCommand(commandText1, connection1)
returnValue = command1.ExecuteNonQuery()
writer.WriteLine("Rows to be affected by command1: {0}", returnValue)
' If you get here, this means that command1 succeeded. By nesting
' the using block for connection2 inside that of connection1, you
' conserve server and network resources as connection2 is opened
' only when there is a chance that the transaction can commit.
Using connection2 As New SqlConnection(connectString2)
' The transaction is escalated to a full distributed
' transaction when connection2 is opened.
connection2.Open()
' Execute the second command in the second database.
returnValue = 0
Dim command2 As SqlCommand = New SqlCommand(commandText2, connection2)
returnValue = command2.ExecuteNonQuery()
writer.WriteLine("Rows to be affected by command2: {0}", returnValue)
End Using
End Using
' The Complete method commits the transaction. If an exception has been thrown,
' Complete is called and the transaction is rolled back.
scope.Complete()
End Using
Catch ex As TransactionAbortedException
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message)
End Try
' Display messages.
Console.WriteLine(writer.ToString())
Return returnValue
End Function
Kommentarer
Infrastrukturen System.Transactions tillhandahåller både en explicit programmeringsmodell baserad på Transaction klassen, samt en implicit programmeringsmodell med hjälp av TransactionScope klassen, där transaktioner hanteras automatiskt av infrastrukturen.
Important
Vi rekommenderar att du skapar implicita transaktioner med hjälp av TransactionScope klassen, så att den omgivande transaktionskontexten hanteras automatiskt åt dig. Du bör också använda TransactionScope klassen och DependentTransaction för program som kräver att samma transaktion används i flera funktionsanrop eller flera trådanrop. Mer information om den här modellen finns i avsnittet Implementera en implicit transaktion med transaktionsomfång . Mer information om hur du skriver ett transaktionsprogram finns i Skriva ett transaktionsprogram.
När du instansierar en TransactionScope av -instruktionen new avgör transaktionshanteraren vilken transaktion som ska ingå. När detta omfång fastställts deltar det alltid i den transaktionen. Beslutet baseras på två faktorer: om det finns en omgivande transaktion och värdet för parametern TransactionScopeOption i konstruktorn. Den omgivande transaktionen är den transaktion som koden körs i. Du kan hämta en referens till den omgivande transaktionen genom att anropa klassens Transaction.Current statiska Transaction egenskap. Mer information om hur den här parametern används finns i avsnittet "Transaktionsflödeshantering" i avsnittet Implementera en implicit transaktion med transaktionsomfång .
Om inget undantag inträffar inom transaktionsomfånget (dvs. mellan initieringen av TransactionScope objektet och anropet av dess Dispose metod) tillåts transaktionen där omfånget deltar fortsätta. Om ett undantag inträffar inom transaktionsomfånget återställs den transaktion som den deltar i.
När programmet har slutfört allt arbete som det vill utföra i en transaktion bör du bara anropa Complete metoden en gång för att informera transaktionshanteraren om att det är acceptabelt att genomföra transaktionen. Om du inte anropar den här metoden avbryts transaktionen.
Ett anrop till Dispose metoden markerar slutet på transaktionsomfånget. Undantag som inträffar efter att den här metoden anropats kanske inte påverkar transaktionen.
Om du ändrar värdet Current för inuti ett omfång genereras ett undantag när Dispose anropas. Men i slutet av omfånget återställs det tidigare värdet. Om du anropar DisposeCurrent i ett transaktionsomfång som skapade transaktionen avbryts transaktionen i slutet av omfånget.
Konstruktorer
| Name | Description |
|---|---|
| TransactionScope() |
Initierar en ny instans av TransactionScope klassen. |
| TransactionScope(Transaction, TimeSpan, EnterpriseServicesInteropOption) |
Initierar en ny instans av TransactionScope klassen med det angivna timeout-värdet och KRAVEN för COM+-samverkan och anger den angivna transaktionen som den omgivande transaktionen, så att transaktionsarbete som utförs inom omfånget använder den här transaktionen. |
| TransactionScope(Transaction, TimeSpan, TransactionScopeAsyncFlowOption) |
[Stöds i .NET Framework 4.5.1 och senare versioner] Initierar en ny instans av TransactionScope klassen med det angivna tidsgränsvärdet och anger den angivna transaktionen som den omgivande transaktionen, så att transaktionsarbete som utförs i omfånget använder den här transaktionen. |
| TransactionScope(Transaction, TimeSpan) |
Initierar en ny instans av TransactionScope klassen med det angivna tidsgränsvärdet och anger den angivna transaktionen som den omgivande transaktionen, så att transaktionsarbete som utförs i omfånget använder den här transaktionen. |
| TransactionScope(Transaction, TransactionScopeAsyncFlowOption) |
[Stöds i .NET Framework 4.5.1 och senare versioner] Initierar en ny instans av TransactionScope klassen och anger den angivna transaktionen som den omgivande transaktionen, så att transaktionsarbete som utförs i omfånget använder den här transaktionen. |
| TransactionScope(Transaction) |
Initierar en ny instans av TransactionScope klassen och anger den angivna transaktionen som den omgivande transaktionen, så att transaktionsarbete som utförs i omfånget använder den här transaktionen. |
| TransactionScope(TransactionScopeAsyncFlowOption) |
Initierar en ny instans av TransactionScope klassen med det angivna asynkrona flödesalternativet. |
| TransactionScope(TransactionScopeOption, TimeSpan, TransactionScopeAsyncFlowOption) |
Initierar en ny instans av TransactionScope klassen med det angivna timeout-värdet, kraven och det asynkrona flödesalternativet. |
| TransactionScope(TransactionScopeOption, TimeSpan) |
Initierar en ny instans av TransactionScope klassen med det angivna tidsgränsvärdet och kraven. |
| TransactionScope(TransactionScopeOption, TransactionOptions, EnterpriseServicesInteropOption) |
Initierar en ny instans av TransactionScope klassen med angivna omfångs- och COM+-samverkanskrav samt transaktionsalternativ. |
| TransactionScope(TransactionScopeOption, TransactionOptions, TransactionScopeAsyncFlowOption) |
[Stöds i .NET Framework 4.5.1 och senare versioner] Initierar en ny instans av TransactionScope klassen med angivna krav och asynkront flödesalternativ. |
| TransactionScope(TransactionScopeOption, TransactionOptions) |
Initierar en ny instans av TransactionScope klassen med de angivna kraven. |
| TransactionScope(TransactionScopeOption, TransactionScopeAsyncFlowOption) |
Initierar en ny instans av TransactionScope klassen med angivna krav och asynkront flödesalternativ. |
| TransactionScope(TransactionScopeOption) |
Initierar en ny instans av TransactionScope klassen med de angivna kraven. |
Metoder
| Name | Description |
|---|---|
| Complete() |
Anger att alla åtgärder inom omfånget har slutförts. |
| Dispose() |
Avslutar transaktionsomfånget. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
Gäller för
Trådsäkerhet
Den här typen är trådsäker.