Helyi tranzakciók
A ADO.NET tranzakciói akkor használatosak, ha több tevékenységet szeretne összefűzni, hogy azok egyetlen munkaegységként legyenek végrehajtva. Tegyük fel például, hogy egy alkalmazás két feladatot hajt végre. Először frissíti a rendelési adatokat tartalmazó táblázatot. Másodszor frissíti a leltáradatokat tartalmazó táblát, és megterheli a megrendelt elemeket. Ha bármelyik feladat meghiúsul, a rendszer mindkét frissítést visszaállítja.
A tranzakció típusának meghatározása
A tranzakciók akkor minősülnek helyi tranzakciónak, ha egyfázisú tranzakcióról van szó, amelyet az adatbázis közvetlenül kezel. A tranzakció akkor minősül elosztott tranzakciónak, ha azt egy tranzakciófigyelő koordinálja, és a tranzakciófeloldáshoz feladatbiztos mechanizmusokat (például kétfázisú véglegesítést) használ.
Minden .NET-keretrendszer adatszolgáltató saját Transaction
objektummal rendelkezik a helyi tranzakciók végrehajtásához. Ha egy SQL Server-adatbázisban tranzakciót szeretne végrehajtani, válasszon ki egy tranzakciót System.Data.SqlClient . Oracle-tranzakció esetén használja a szolgáltatót System.Data.OracleClient . Emellett egy DbTransaction olyan osztály is elérhető, amely szolgáltatófüggetlen kódot ír, amelyhez tranzakciókra van szükség.
Feljegyzés
A tranzakciók akkor a leghatékonyabbak, ha a kiszolgálón hajtják végre őket. Ha olyan SQL Server-adatbázissal dolgozik, amely széles körben használja az explicit tranzakciókat, érdemes lehet tárolt eljárásként írni őket a Transact-SQL BEGIN TRANSACTION utasítással.
Tranzakció végrehajtása egyetlen Csatlakozás ion használatával
A ADO.NET az objektummal kapcsolatos Connection
tranzakciókat szabályozza. A metódussal BeginTransaction
helyi tranzakciót kezdeményezhet. Miután megkezdte a tranzakciót, felvehet egy parancsot a Transaction
tranzakcióba egy Command
objektum tulajdonságával. Ezután véglegesítheti vagy visszaállíthatja az adatforrásban végrehajtott módosításokat a tranzakció összetevőinek sikeressége vagy sikertelensége alapján.
Feljegyzés
A EnlistDistributedTransaction
metódus nem használható helyi tranzakcióhoz.
A tranzakció hatóköre a kapcsolatra korlátozódik. Az alábbi példa egy explicit tranzakciót hajt végre, amely a blokk két különálló parancsából try
áll. A parancsok IN Standard kiadás RT-utasításokat hajtanak végre az AdventureWorks SQL Server mintaadatbázis Production.ScrapReason táblájában, amelyek akkor lesznek véglegesítve, ha nincs kivétel. A blokk kódja catch
kivétel esetén visszaállítja a tranzakciót. Ha a tranzakció megszakadt, vagy a kapcsolat a tranzakció befejezése előtt lezárul, a rendszer automatikusan visszaállítja azt.
Példa
Kövesse az alábbi lépéseket egy tranzakció végrehajtásához.
Hívja meg az BeginTransaction SqlConnection objektum metódusát a tranzakció kezdetének megjelöléséhez. A BeginTransaction metódus a tranzakcióra mutató hivatkozást ad vissza. Ez a hivatkozás a SqlCommand tranzakcióban szereplő objektumokhoz van hozzárendelve.
Rendelje hozzá az
Transaction
objektumot a Transaction SqlCommand végrehajtandó tulajdonsághoz. Ha egy parancsot aktív tranzakcióval rendelkező kapcsolaton hajtanak végre, és azTransaction
objektum nincs hozzárendelve azTransaction
Command
objektum tulajdonságához, a rendszer kivételt jelez.Hajtsa végre a szükséges parancsokat.
Hívja meg az Commit SqlTransaction objektum metódusát a tranzakció befejezéséhez, vagy hívja meg a Rollback metódust a tranzakció befejezéséhez. Ha a kapcsolat lezárul, vagy a metódusok végrehajtása előtt Commit megszűnik, Rollback a rendszer visszaállítja a tranzakciót.
Az alábbi példakód a ADO.NET a Microsoft SQL Serverrel való tranzakciós logikát mutatja be.
using (SqlConnection connection = new(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);
}
}
}
Using connection As New SqlConnection(connectionString)
connection.Open()
' Start a local transaction.
Dim sqlTran As SqlTransaction = connection.BeginTransaction()
' Enlist a command in the current transaction.
Dim command As SqlCommand = 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 ex As Exception
' Handle the exception if the transaction fails to commit.
Console.WriteLine(ex.Message)
Try
' Attempt to roll back the transaction.
sqlTran.Rollback()
Catch exRollback As Exception
' Throws an InvalidOperationException if the connection
' is closed or the transaction has already been rolled
' back on the server.
Console.WriteLine(exRollback.Message)
End Try
End Try
End Using