Bagikan melalui


Transaksi Lokal

Transaksi dalam ADO.NET digunakan saat Anda ingin mengikat beberapa tugas bersama-sama sehingga dijalankan sebagai satu unit kerja. Misalnya, bayangkan bahwa aplikasi melakukan dua tugas. Pertama, ini memperbarui tabel dengan informasi pesanan. Kedua, ini memperbarui tabel yang berisi informasi inventori, mendebit item yang dipesan. Jika salah satu tugas gagal, kedua pembaruan akan digulung balik.

Menentukan Jenis Transaksi

Transaksi dianggap sebagai transaksi lokal ketika merupakan transaksi fase tunggal dan ditangani oleh database secara langsung. Transaksi dianggap sebagai transaksi terdistribusi ketika dikoordinasikan oleh monitor transaksi dan menggunakan mekanisme fail-safe (seperti penerapan dua fase) untuk resolusi transaksi.

Masing-masing penyedia data .NET Framework memiliki objeknya sendiri Transaction untuk melakukan transaksi lokal. Jika Anda mengharuskan transaksi dilakukan dalam database SQL Server, pilih System.Data.SqlClient transaksi. Untuk transaksi Oracle, gunakan System.Data.OracleClient penyedia layanan. Selain itu, ada DbTransaction kelas yang tersedia untuk menulis kode penyedia independen yang memerlukan transaksi.

Nota

Transaksi paling efisien ketika dilakukan di server. Jika Anda bekerja dengan database SQL Server yang memanfaatkan transaksi eksplisit secara ekstensif, pertimbangkan untuk menulisnya sebagai prosedur tersimpan menggunakan pernyataan Transact-SQL BEGIN TRANSACTION.

Melakukan Transaksi Menggunakan Satu Koneksi

Dalam ADO.NET, Anda mengontrol transaksi dengan Connection objek . Anda dapat memulai transaksi lokal dengan metode .BeginTransaction Setelah memulai transaksi, Anda dapat mendaftarkan perintah dalam transaksi tersebut Transaction dengan properti Command objek. Anda kemudian dapat menerapkan atau mengembalikan modifikasi yang dilakukan di sumber data berdasarkan keberhasilan atau kegagalan komponen transaksi.

Nota

Metode EnlistDistributedTransaction tidak boleh digunakan untuk transaksi lokal.

Cakupan transaksi terbatas pada koneksi. Contoh berikut melakukan transaksi eksplisit yang terdiri dari dua perintah terpisah di try blok. Perintah menjalankan pernyataan INSERT terhadap tabel Production.ScrapReason dalam database sampel AdventureWorks SQL Server, yang dikonfirmasi jika tidak ada pengecualian terjadi. Kode dalam blok catch membatalkan transaksi jika terjadi pengecualian. Jika transaksi dibatalkan atau koneksi ditutup sebelum transaksi selesai, transaksi secara otomatis digulung balik.

Contoh

Ikuti langkah-langkah ini untuk melakukan transaksi.

  1. Panggil metode BeginTransaction dari objek SqlConnection untuk menandai awal transaksi. Metode BeginTransaction mengembalikan referensi ke transaksi. Referensi ini ditetapkan ke SqlCommand objek yang terdaftar dalam transaksi.

  2. Tetapkan objek Transaction ke properti Transaction dari SqlCommand untuk dieksekusi. Jika perintah dijalankan pada koneksi dengan transaksi aktif, dan objek Transaction belum ditetapkan ke properti Transaction dari objek Command, maka pengecualian akan dilempar.

  3. Jalankan perintah yang diperlukan.

  4. Commit Panggil metode SqlTransaction objek untuk menyelesaikan transaksi, atau panggil Rollback metode untuk mengakhiri transaksi. Jika koneksi ditutup atau dibuang sebelum metode Commit atau Rollback dieksekusi, transaksi dibatalkan.

Contoh kode berikut menunjukkan logika transaksional menggunakan ADO.NET dengan Microsoft SQL Server.

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

Lihat juga