Mengaktifkan beberapa kumpulan hasil aktif
Multiple Active Result Sets (MARS) adalah fitur yang bekerja dengan SQL Server untuk memungkinkan eksekusi beberapa batch dalam satu koneksi. Saat MARS diaktifkan untuk digunakan dengan SQL Server, setiap objek perintah yang digunakan menambahkan sesi ke koneksi.
Catatan
Satu sesi MARS membuka satu koneksi logis untuk digunakan MARS kemudian satu koneksi logis untuk setiap perintah aktif.
Mengaktifkan dan Menonaktifkan MARS di dalam String Koneksi
Catatan
String koneksi berikut ini menggunakan sampel database AdventureWorks yang disertakan dengan SQL Server. String koneksi yang disediakan mengasumsikan bahwa database terpasang pada server bernama MSSQL1. Ubah string koneksi seperlunya untuk lingkungan Anda.
Fitur MARS dinonaktifkan secara default. Ini dapat diaktifkan dengan menambahkan "MultipleActiveResultSets=True"
pasangan kata kunci ke string koneksi Anda. "True" adalah satu-satunya nilai yang valid untuk mengaktifkan MARS. Contoh berikut ini menunjukkan cara menyambungkan ke instans SQL Server dan cara menentukan bahwa MARS harus diaktifkan.
Dim connectionString As String = "..." & _
"MultipleActiveResultSets=True"
string connectionString = "..." +
"MultipleActiveResultSets=True";
Anda dapat menonaktifkan MARS dengan menambahkan "MultipleActiveResultSets=False"
pasangan kata kunci ke string koneksi Anda. "True" adalah satu-satunya nilai yang valid untuk menonaktifkan MARS.
Pertimbangan Khusus Ketika Menggunakan MARS
Secara umum, aplikasi yang ada seharusnya tidak memerlukan modifikasi untuk menggunakan koneksi berkemampuan MARS. Namun, jika Anda ingin menggunakan fitur MARS pada aplikasi Anda, Anda harus memahami pertimbangan khusus berikut.
Pernyataan Interleaving
Operasi MARS dijalankan secara sinkron di server. Pernyataan interleaving dari pernyataan SELECT dan BULK INSERT diperbolehkan. Tetapi, bahasa manipulasi data (Data Manipulation Language/DML) dan pernyataan bahasa definisi data (data definition language/DDL) dijalankan secara atomik. Setiap pernyataan yang mencoba menjalankan saat batch atom dieksekusi akan diblokir. Eksekusi paralel di server bukanlah fitur MARS.
Jika dua batch dikirimkan di bawah koneksi MARS, salah satunya berisi pernyataan SELECT dan yang lain berisi pernyataan DML, DML dapat memulai menjalankannya dalam pelaksanaan pernyataan SELECT. Namun, pernyataan DML harus berjalan sampai selesai sebelum pernyataan SELECT bisa membuat kemajuan. Bila kedua pernyataan berjalan di bawah transaksi yang sama, setiap perubahan yang dibuat oleh pernyataan DML setelah pernyataan SELECT memulai eksekusi tidak terlihat oleh operasi baca.
Pernyataan WAITFOR di dalam pernyataan SELECT tidak menghasilkan transaksi saat menunggu, yaitu, hingga baris pertama diproduksi. Ini menyiratkan bahwa tidak ada batch lain yang bisa berjalan dalam koneksi yang sama saat pernyataan WAITFOR sedang menunggu.
Cache Sesi MARS
Saat koneksi dibuka dengan MARS yang aktif, sesi logis dibuat, yang menambahkan overhead tambahan. Untuk meminimalkan overhead dan meningkatkan performa, SqlClient meng-cache sesi MARS dalam koneksi. Cache berisi paling banyak 10 sesi MARS. Nilai ini tidak bisa disesuaikan pengguna. Jika batas sesi tercapai, sesi baru akan dibuat—kesalahan tidak dihasilkan. Cache dan sesi yang terkandung di dalamnya adalah per koneksi; tidak dibagikan di seluruh koneksi. Saat sesi dirilis, sesi akan dikembalikan ke kolam kecuali batas atas kolam telah tercapai. Jika kumpulan cache penuh, sesi akan ditutup. Sesi MARS tidak kedaluwarsa. Tetapi hanya dibersihkan ketika objek koneksi dibuang. Cache sesi MARS tidak dimuat sebelumnya. Cache dimuat karena aplikasi membutuhkan lebih banyak sesi.
Keamanan Thread
Operasi MARS tidak aman untuk thread.
Kumpulan koneksi
Koneksi berkemampuan MARS dikumpulkan, sama seperti koneksi lainnya. Jika aplikasi membuka dua koneksi, satu dengan MARS aktif dan satu dengan MARS dinonaktifkan, kedua koneksi berada di kumpulan terpisah. Untuk informasi selengkapnya, lihat Kumpulan Koneksi SQL Server (ADO.NET).
Lingkungan Eksekusi Batch SQL Server
Ketika koneksi dibuka, lingkungan default ditentukan. Lingkungan ini lalu disalin ke dalam sesi MARS logis.
Lingkungan produksi mencakup komponen-komponen berikut ini:
Atur opsi (contohnya, ANSI_NULLS, DATE_FORMAT, BAHASA, TEXTIZE)
Konteks keamanan (peran pengguna/aplikasi)
Konteks database (database saat ini)
Variabel status eksekusi (misalnya, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)
Tabel sementara tingkat atas
Dengan MARS, lingkungan eksekusi default akan dikaitkan dengan koneksi. Setiap batch baru yang mulai dijalankan di bawah koneksi tertentu akan menerima salinan lingkungan default. Setiap kali kode dijalankan di bawah batch tertentu, semua perubahan yang dibuat pada lingkungan akan dicakup ke batch tertentu. Setelah eksekusi selesai, pengaturan eksekusi kemudian disalin ke lingkungan default. Dalam kasus batch tunggal yang mengeluarkan beberapa perintah yang akan dijalankan secara berurutan di bawah transaksi yang sama, semantiknya sama dengan yang diekspos oleh koneksi yang melibatkan klien atau server sebelumnya.
Eksekusi Paralel
MARS tidak dirancang untuk menghapus seluruh persyaratan untuk beberapa koneksi dalam aplikasi. Jika sebuah aplikasi memerlukan eksekusi paralel perintah yang benar terhadap server, beberapa koneksi harus digunakan.
Misalnya, pertimbangkan skenario berikut. Dua objek perintah dibuat, satu untuk memproses kumpulan hasil dan satu lagi untuk memperbarui data; kedua objek tersebut berbagi koneksi umum melalui MARS. Dalam skenario ini, Transaction
.Commit
gagal pada pembaruan sampai semua hasil telah dibaca pada objek perintah pertama, dan menghasilkan pengecualian berikut:
Pesan: Konteks transaksi sedang digunakan oleh sesi lain.
Sumber: Penyedia data .NET SqlClient
Diharapkan: (null)
Diterima: System.Data.SqlClient.SqlException
Terdapat tiga opsi untuk menangani skenario ini:
Mulai transaksi setelah pembaca dibuat, sehingga bukan menjadi bagian dari transaksi. Setiap pembaruan akan menjadi transaksinya sendiri.
Terapkan semua pekerjaan setelah pembaca ditutup. Ini memiliki potensi untuk pembaruan dalam jumlah besar.
Jangan gunakan MARS; sebagai gantinya, gunakan koneksi terpisah untuk setiap objek perintah seperti yang Anda miliki sebelum MARS.
Mendeteksi Dukungan MARS
Aplikasi bisa memeriksa dukungan MARS dengan membaca nilai SqlConnection.ServerVersion
. Angka utamanya harus 9 untuk SQL Server 2005 dan 10 untuk SQL Server 2008.