Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: .NET Framework
.NET
Standard
Transakce v ADO.NET se používají, když chcete svázat více úkolů dohromady, aby se spouštěly jako jedna jednotka práce. Představte si například, že aplikace provádí dvě úlohy. Nejprve aktualizuje tabulku s informacemi o objednávce. Za druhé aktualizuje tabulku, která obsahuje informace o inventáři a inkasuje objednané položky. Pokud některý z úkolů selže, vrátí se obě aktualizace zpět.
Určení typu transakce
Transakce se považuje za místní transakci, pokud se jedná o jednofázovou transakci a zpracovává ji přímo databáze. Transakce se považuje za distribuovanou transakci, když je koordinovaná monitorováním transakcí a používá mechanismy bezpečné pro selhání (například dvoufázové potvrzení) pro řešení transakcí.
Zprostředkovatel dat Microsoft SqlClient pro SQL Server má vlastní SqlTransaction objekt pro provádění místních transakcí v databázích SQL Serveru. Další zprostředkovatelé dat .NET také poskytují vlastní Transaction objekty. Kromě toho je k dispozici třída DbTransaction, která umožňuje psát kód nezávislý na poskytovateli, který vyžaduje transakce.
Poznámka:
Transakce jsou nejúčinnější při provádění na serveru. Pokud pracujete s databází SQL Serveru, která provádí rozsáhlé využití explicitních transakcí, zvažte jejich zápis jako uložené procedury pomocí příkazu Transact-SQL BEGIN TRANSACTION.
Provedení transakce pomocí jediného připojení
V ADO.NET řídíte transakce s objektem Connection . S metodou BeginTransaction můžete zahájit místní transakci. Jakmile začnete transakci, můžete do této transakce zahrnout příkaz s Transaction vlastností objektu Command . Změny provedené ve zdroji dat pak můžete potvrdit nebo vrátit zpět na základě úspěchu nebo selhání komponent transakce.
Poznámka:
Metoda EnlistDistributedTransaction by neměla být použita pro místní transakci.
Rozsah transakce je omezen na připojení. Následující příklad provádí explicitní transakci, která se skládá ze dvou samostatných příkazů v try bloku. Příkazy spouštějí INSERT příkazy proti Production.ScrapReason tabulce v ukázkové databázi AdventureWorks SQL Server, které jsou potvrzeny, pokud nejsou vyvolány žádné výjimky. Kód v catch bloku vrátí transakci zpět, pokud je vyvolána výjimka. Pokud je transakce přerušena nebo je připojení uzavřeno před dokončením transakce, automaticky se vrátí zpět.
Example
K provedení transakce použijte tento postup.
Zavolejte metodu objektu BeginTransaction pro označení začátku transakce. Metoda BeginTransaction vrátí odkaz na transakci. Tento odkaz je přiřazen k SqlCommand objektům, které jsou zařazeny do transakce.
Přiřaďte objekt
Transactionk vlastnosti Transaction objektu SqlCommand, který má být proveden. Pokud je příkaz proveden na připojení s aktivní transakcí aTransactionobjekt nebyl přiřazen kTransactionvlastnosti objektuCommand, je vyvolána výjimka.Spusťte požadované příkazy.
Commit Volání metody objektu SqlTransaction k dokončení transakce, nebo volání Rollback metody pro ukončení transakce. Pokud je připojení uzavřeno nebo uvolněno před provedením Commit nebo Rollback metody, transakce se vrátí zpět.
Následující příklad kódu ukazuje transakční logiku pomocí zprostředkovatele dat Microsoft SqlClient pro SQL Server.
using System;
using Microsoft.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Data Source = localhost; Integrated Security = true; Initial Catalog = AdventureWorks";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// Start a local transaction.
SqlTransaction sqlTran = connection.BeginTransaction();
// Enlist a command in the current transaction.
SqlCommand command = connection.CreateCommand();
command.Transaction = sqlTran;
try
{
// Execute two separate commands.
command.CommandText =
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')";
command.ExecuteNonQuery();
command.CommandText =
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')";
command.ExecuteNonQuery();
// Commit the transaction.
sqlTran.Commit();
Console.WriteLine("Both records were written to database.");
}
catch (Exception ex)
{
// Handle the exception if the transaction fails to commit.
Console.WriteLine(ex.Message);
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Console.WriteLine(exRollback.Message);
}
}
}
}
}