Megosztás a következőn keresztül:


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.

  1. 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.

  2. 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 az Transaction objektum nincs hozzárendelve az Transaction Command objektum tulajdonságához, a rendszer kivételt jelez.

  3. Hajtsa végre a szükséges parancsokat.

  4. 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

Lásd még