Transaksi terdistribusi
Berlaku untuk: .NET Framework .NET .NET Standard
Transaksi adalah sekumpulan tugas terkait yang berhasil (menerapkan) atau pun yang gagal (membatalkan) sebagai unit, di antara yang lain. Sebuah transaksi terdistribusi adalah transaksi yang memengaruhi beberapa sumber daya. Agar transaksi terdistribusi untuk melakukan penerapan, semua peserta harus menjamin bahwa setiap perubahan pada data akan menjadi permanen. Perubahan harus tetap ada meskipun terjadi crash pada sistem atau terjadi peristiwa tak terduga lainnya. Bahkan jika satu peserta gagal membuat jaminan ini, maka seluruh transaksi gagal, dan setiap perubahan pada data dalam cakupan transaksi akan digulung balik.
Catatan
Untuk informasi tentang transaksi terdistribusi di Azure SQL Database dan Azure SQL Managed Instance, lihat Transaksi terdistribusi di seluruh database cloud.
Bekerja dengan System.Transactions
Di .NET, transaksi terdistribusi dikelola melalui API di System.Transactions namespace layanan. API System.Transactions akan mengirimkan penanganan transaksi terdistribusi ke monitor transaksi seperti Koordinator Transaksi Terdistribusi Microsoft (MS DTC) ketika beberapa manajer sumber daya persisten terlibat. Untuk informasi selengkapnya, lihat Dasar-Dasar Transaksi.
ADO.NET 2.0 memperkenalkan dukungan untuk mendaftar dalam transaksi terdistribusi menggunakan metode EnlistTransaction
, yang mendaftarkan koneksi dalam Transaction instans. Dalam versi ADO.NET sebelumnya, pendaftaran eksplisit dalam transaksi terdistribusi dilakukan menggunakan metode koneksi EnlistDistributedTransaction
untuk mendaftarkan koneksi dalam instans ITransaction, yang didukung untuk kompatibilitas mundur. Untuk informasi selengkapnya tentang transaksi Layanan Enterprise, lihat Interoperabilitas dengan Layanan Perusahaan dan Transaksi COM+.
Saat menggunakan System.Transactions transaksi dengan Penyedia Data Microsoft SqlClient untuk SQL Server terhadap database SQL Server, ringan Transaction akan secara otomatis digunakan. Transaksi kemudian dapat dipromosikan ke transaksi terdistribusi penuh sesuai kebutuhan. Untuk informasi selengkapnya, lihat Integrasi System.Transactions dengan SQL Server.
Mendaftarkan secara otomatis dalam transaksi terdistribusi
Pendaftaran otomatis adalah cara default (dan pilihan) untuk mengintegrasikan koneksi ADO.NET dengan System.Transactions
. Objek koneksi akan secara otomatis mendaftar dalam transaksi terdistribusi yang ada jika menentukan bahwa transaksi aktif, yang, dalam hal System.Transaction
, berarti Transaction.Current
tidak null. Pendaftaran transaksi otomatis terjadi ketika koneksi dibuka. Pendaftaran ini tidak akan terjadi setelah itu bahkan jika perintah dijalankan di dalam cakupan transaksi. Anda dapat menonaktifkan pendaftaran otomatis dalam transaksi yang ada dengan menentukan Enlist=false
sebagai parameter string koneksi untuk SqlConnection.ConnectionString.
Mendaftar secara manual dalam transaksi terdistribusi
Jika pendaftaran otomatis dinonaktifkan atau Anda perlu mendaftarkan transaksi yang dimulai setelah koneksi dibuka, Anda dapat mendaftarkan transaksi terdistribusi yang ada menggunakan EnlistTransaction
metode SqlConnection objek untuk Penyedia Data Microsoft SqlClient untuk SQL Server. Mendaftar dalam transaksi terdistribusi yang ada memastikan bahwa, jika transaksi diterapkan atau digulung balik, modifikasi yang dibuat oleh kode pada sumber data juga akan dilakukan atau digulung balik.
Catatan
Pengecualian akan diterapkan jika Anda mencoba menerapkan atau menggulung balik transaksi jika DataReader
dimulai saat transaksi aktif.
Mendaftar dalam transaksi terdistribusi sangat berlaku saat mengumpulkan objek bisnis. Jika objek bisnis dikumpulkan dengan koneksi terbuka, pendaftaran transaksi otomatis hanya terjadi saat koneksi tersebut dibuka. Jika beberapa transaksi dilakukan menggunakan objek bisnis yang dikumpulkan, koneksi terbuka untuk objek tersebut tidak akan secara otomatis mendaftar dalam transaksi yang baru dimulai. Dalam hal ini, Anda dapat menonaktifkan pendaftaran transaksi otomatis untuk koneksi dan mendaftarkan koneksi dalam transaksi menggunakan EnlistTransaction
.
EnlistTransaction
mengambil satu argumen jenis Transaction yang merupakan referensi ke transaksi yang ada. Setelah memanggil metode koneksi EnlistTransaction
, semua modifikasi yang dilakukan pada sumber data menggunakan koneksi yang disertakan dalam transaksi. Meneruskan nilai null membatalkan daftar koneksi dari pendaftaran transaksi terdistribusi saat ini. Perhatikan bahwa koneksi harus dibuka sebelum memanggil EnlistTransaction
.
Catatan
Setelah koneksi secara eksplisit terdaftar pada transaksi, koneksi tidak dapat membatalkan daftar atau terdaftar dalam transaksi lain sampai transaksi pertama selesai.
Perhatian
EnlistTransaction
melempar pengecualian jika koneksi telah memulai transaksi menggunakan metode koneksi BeginTransaction. Namun, jika transaksi adalah transaksi lokal yang dimulai di sumber data (misalnya, menjalankan pernyataan BEGIN TRANSACTION secara eksplisit menggunakan SqlCommand), EnlistTransaction
akan mengembalikan transaksi lokal dan mendaftarkan dalam transaksi terdistribusi yang ada seperti yang diminta. Anda tidak akan menerima pemberitahuan bahwa transaksi lokal digulung balik, dan harus mengelola transaksi lokal apa pun yang tidak mulai menggunakan BeginTransaction. Jika Anda menggunakan Penyedia Data Microsoft SqlClient untuk SQL Server dengan SQL Server, upaya untuk mendaftar akan melemparkan pengecualian. Semua kasus lain tidak akan terdeteksi.
Transaksi promotable di SQL Server
SQL Server mendukung transaksi yang dapat dipromosikan di mana transaksi ringan lokal dapat secara otomatis dipromosikan ke transaksi terdistribusi hanya jika diperlukan. Transaksi yang dapat diproyeksikan tidak memanggil overhead tambahan dari transaksi terdistribusi kecuali overhead yang ditambahkan diperlukan. Untuk informasi selengkapnya dan sampel kode, lihat Integrasi System.Transactions dengan SQL Server.
Mengonfigurasi Transaksi Terdistribusi
Anda mungkin perlu mengaktifkan MS DTC melalui jaringan untuk menggunakan transaksi terdistribusi. Jika Windows Firewall lokal server diaktifkan, Anda harus mengizinkan layanan MS DTC untuk menggunakan jaringan atau membuka port MS DTC.