Bagikan melalui


Menggunakan System.Transactions

Berlaku untuk: SQL Server

Namespace layanan System.Transactions menyediakan kerangka kerja transaksi yang sepenuhnya terintegrasi dengan integrasi ADO.NET dan SQL Server common language runtime (CLR). Kelas System.Transactions.TransactionScope membuat blok kode transaksional dengan secara implisit mendaftarkan koneksi dalam transaksi terdistribusi. Anda harus memanggil metode Lengkap di akhir blok kode yang ditandai oleh TransactionScope. Metode Buang dipanggil ketika eksekusi program meninggalkan blok kode, menyebabkan transaksi dihentikan jika metode Lengkap tidak dipanggil. Jika pengecualian telah dilemparkan yang menyebabkan kode meninggalkan cakupan, transaksi dianggap dihentikan.

Kami menyarankan agar Anda menggunakan blok penggunaan untuk memastikan bahwa metode Buang dipanggil pada objek TransactionScope saat blok penggunaan keluar. Kegagalan untuk menerapkan atau menggulung balik transaksi yang tertunda dapat secara serius menurunkan performa karena batas waktu default untuk TransactionScope adalah satu menit. Jika Anda tidak menggunakan pernyataan penggunaan , Anda harus melakukan semua pekerjaan di blok Coba dan secara eksplisit memanggil metode Buang di blok Akhirnya .

Jika pengecualian terjadi dalam TransactionScope, transaksi ditandai sebagai tidak konsisten dan ditinggalkan. Ini digulung balik ketika TransactionScope dibuang. Jika tidak ada pengecualian terjadi, transaksi yang berpartisipasi akan diterapkan.

TransactionScope harus digunakan hanya ketika sumber data lokal dan jarak jauh atau manajer sumber daya eksternal sedang diakses. Ini karena TransactionScope selalu menyebabkan transaksi dipromosikan, meskipun hanya digunakan dalam koneksi konteks.

Catatan

Kelas TransactionScope membuat transaksi dengan System.Transactions.Transaction.IsolationLevel dari Serializable secara default. Bergantung pada aplikasi Anda, Anda mungkin ingin mempertimbangkan untuk menurunkan tingkat isolasi guna menghindari konflik yang tinggi dalam aplikasi Anda.

Catatan

Sebaiknya Anda hanya melakukan pembaruan, penyisipan, dan penghapusan dalam transaksi terdistribusi terhadap server jarak jauh karena menggunakan sumber daya database yang signifikan. Jika operasi akan dilakukan di server lokal, transaksi terdistribusi tidak diperlukan dan transaksi lokal sudah cukup. Pernyataan SELECT dapat mengunci sumber daya database secara tidak perlu, dan dalam beberapa skenario mungkin perlu menggunakan transaksi untuk memilih. Setiap pekerjaan non-database harus dilakukan di luar cakupan transaksi, kecuali melibatkan manajer sumber daya lain yang ditransaksikan. Meskipun pengecualian dalam cakupan transaksi mencegah transaksi dilakukan, kelas TransactionScope tidak memiliki ketentuan untuk menggulung balik perubahan apa pun yang telah dilakukan kode Anda di luar cakupan transaksi itu sendiri. Jika Anda perlu mengambil beberapa tindakan ketika transaksi digulung balik, Anda harus menulis implementasi Anda sendiri dari antarmuka System.Transactions.IEnlistmentNotification , dan secara eksplisit mendaftar dalam transaksi.

Contoh

Untuk bekerja dengan System.Transactions, Anda harus memiliki referensi ke file System.Transactions.dll.

Kode berikut menunjukkan cara membuat transaksi yang dapat dipromosikan terhadap dua instans SQL Server yang berbeda. Instans ini diwakili oleh dua objek System.Data.SqlClient.SqlConnection yang berbeda, yang dibungkus dalam blok TransactionScope. Kode membuat blok TransactionScope dengan pernyataan penggunaan , dan membuka koneksi pertama, yang secara otomatis mendaftarkannya di TransactionScope. Transaksi ini awalnya terdaftar sebagai transaksi ringan, bukan transaksi terdistribusi penuh. Kode mengasumsikan adanya logika bersyar (yang telah dihilangkan untuk brevity). Ini membuka koneksi kedua hanya jika diperlukan, mendaftarkannya di TransactionScope. Ketika koneksi dibuka, transaksi secara otomatis dipromosikan ke transaksi terdistribusi penuh. Kode kemudian memanggil TransactionScope.Complete, yang melakukan transaksi. Kode membuang dua koneksi saat keluar dari pernyataan penggunaan untuk koneksi. Metode TransactionScope.Dispose untuk TransactionScope secara otomatis dipanggil pada penghentian blok penggunaan untuk TransactionScope. Jika pengecualian telah dilemparkan pada titik mana pun di blok TransactionScope , Selesai tidak dipanggil, dan transaksi terdistribusi akan kembali ketika TransactionScope dibuang.

Visual Basic

Using transScope As New TransactionScope()  
    Using connection1 As New SqlConnection(connectString1)  
        ' Opening connection1 automatically enlists it in the   
        ' TransactionScope as a lightweight transaction.  
        connection1.Open()  
  
        ' Do work in the first connection.  
  
        ' Assumes conditional logic in place where the second  
        ' connection will only be opened as needed.  
        Using connection2 As New SqlConnection(connectString2)  
            ' Open the second connection, which enlists the   
            ' second connection and promotes the transaction to  
            ' a full distributed transaction.  
            connection2.Open()  
  
            ' Do work in the second connection.  
  
        End Using  
    End Using  
  
    ' Commit the transaction.  
    transScope.Complete()  
End Using  

C#

using (TransactionScope transScope = new TransactionScope())  
{  
    using (SqlConnection connection1 = new   
       SqlConnection(connectString1))  
    {  
        // Opening connection1 automatically enlists it in the   
        // TransactionScope as a lightweight transaction.  
        connection1.Open();  
  
        // Do work in the first connection.  
  
        // Assumes conditional logic in place where the second  
        // connection will only be opened as needed.  
        using (SqlConnection connection2 = new   
            SqlConnection(connectString2))  
        {  
            // Open the second connection, which enlists the   
            // second connection and promotes the transaction to  
            // a full distributed transaction.   
            connection2.Open();  
  
            // Do work in the second connection.  
        }  
    }  
    //  The Complete method commits the transaction.  
    transScope.Complete();  
}  

Lihat Juga

Integrasi dan Transaksi CLR