Udostępnij przez


Transakcje lokalne

Dotyczy: .NET Framework .NET Standard

Pobieranie ADO.NET

Transakcje w ADO.NET są używane, gdy chcesz powiązać wiele zadań razem, aby były wykonywane jako pojedyncza jednostka pracy. Załóżmy na przykład, że aplikacja wykonuje dwa zadania. Najpierw aktualizuje tabelę z informacjami o kolejności. Po drugie, aktualizuje tabelę zawierającą informacje o stanie magazynowym, odejmując zamówione przedmioty. Jeśli zadanie zakończy się niepowodzeniem, oba aktualizacje zostaną wycofane.

Określanie typu transakcji

Transakcja jest uważana za transakcję lokalną, gdy jest transakcją jednofazową i jest obsługiwana bezpośrednio przez bazę danych. Transakcja jest uważana za transakcję rozproszoną, gdy jest koordynowana przez monitor transakcji i używa mechanizmów niezawodnych (takich jak zatwierdzenie dwufazowe) na potrzeby rozstrzygania transakcji.

Dostawca danych Programu Microsoft SqlClient dla programu SQL Server ma własny SqlTransaction obiekt do wykonywania transakcji lokalnych w bazach danych programu SQL Server. Inni dostawcy danych platformy .NET udostępniają również własne Transaction obiekty. Ponadto istnieje klasa dostępna do wykorzystania przy pisaniu kodu niezależnego od dostawcy DbTransaction, który wymaga transakcji.

Uwaga / Notatka

Transakcje są najbardziej wydajne, gdy są wykonywane na serwerze. Jeśli pracujesz z bazą danych programu SQL Server, która intensywnie korzysta z jawnych transakcji, rozważ zapisanie ich jako procedur składowanych przy użyciu instrukcji Transact-SQL BEGIN TRANSACTION.

Wykonywanie transakcji przy użyciu jednego połączenia

W ADO.NET kontrolujesz transakcje za pomocą obiektu Connection. Możesz zainicjować transakcję lokalną za pomocą metody BeginTransaction. Po rozpoczęciu transakcji możesz zarejestrować polecenie w ramach tej transakcji, korzystając z właściwości Transaction obiektu Command. Następnie można zatwierdzić lub wycofać modyfikacje wprowadzone w źródle danych na podstawie powodzenia lub niepowodzenia składników transakcji.

Uwaga / Notatka

Metoda EnlistDistributedTransaction nie powinna być używana dla transakcji lokalnej.

Zakres transakcji jest ograniczony do połączenia. Poniższy przykład wykonuje jawną transakcję składającą się z dwóch oddzielnych poleceń w try bloku. Polecenia wykonują instrukcje INSERT do tabeli Production.ScrapReason w przykładowej bazie danych AdventureWorks SQL Server, które są zatwierdzane, jeśli nie są zgłaszane żadne wyjątki. Kod w catch bloku cofa transakcję, jeśli zostanie zgłoszony wyjątek. Jeśli transakcja zostanie przerwana lub połączenie zostanie zamknięte przed zakończeniem transakcji, zostanie ono automatycznie wycofane.

Example

Wykonaj następujące kroki, aby wykonać transakcję.

  1. Wywołaj metodę BeginTransactionSqlConnection obiektu, aby oznaczyć początek transakcji. Metoda BeginTransaction zwraca odwołanie do transakcji. To odwołanie jest przypisywane do SqlCommand obiektów wymienionych w transakcji.

  2. Przypisz obiekt Transaction do właściwości Transaction obiektu SqlCommand, który ma zostać wykonany. Jeśli polecenie jest wykonywane w połączeniu z aktywną transakcją, a Transaction obiekt nie został przypisany do Transaction właściwości Command obiektu, zgłaszany jest wyjątek.

  3. Wykonaj wymagane polecenia.

  4. Wywołaj metodę CommitSqlTransaction obiektu, aby zakończyć transakcję, lub wywołaj Rollback metodę , aby zakończyć transakcję. Jeśli połączenie zostanie zamknięte lub usunięte przed wykonaniem metod Commit lub Rollback, transakcja zostanie wycofana.

Poniższy przykład kodu przedstawia logikę transakcyjną przy użyciu dostawcy danych Microsoft SqlClient dla programu 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);
                }
            }
        }
    }
}

Zobacz także