Dil

Birden çok etkin sonuç kümesini etkinleştirme

Birden Çok Etkin Sonuç Kümesi (MARS), tek bir bağlantıda birden çok toplu işlemin yürütülmesine izin vermek için SQL Server ile birlikte çalışan bir özelliktir. MARS, SQL Server ile kullanılmak üzere etkinleştirildiğinde, kullanılan her komut nesnesi bağlantıya bir oturum ekler.

Not

Tek bir MARS oturumu, MARS'ın kullanması için bir mantıksal bağlantı ve her etkin komut için bir mantıksal bağlantı açar.

Bağlantı Dizesinde MARS'ı Etkinleştirme ve Devre Dışı Bırakma

Not

Aşağıdaki bağlantı dizeleri SQL Server'da bulunan örnek AdventureWorks veritabanını kullanır. Sağlanan bağlantı dizesi veritabanının MSSQL1 adlı bir sunucuya yüklendiği varsayılır. Ortamınız için bağlantı dizesini gerektiği gibi değiştirin.

MARS özelliği varsayılan olarak devre dışıdır. Bağlantı dizesine "MultipleActiveResultSets=True" anahtar sözcük çifti eklenerek etkinleştirilebilir. "True", MARS'ın etkinleştirilmesi için tek geçerli değerdir. Aşağıdaki örnekte SQL Server örneğine nasıl bağlanılacağı ve MARS'ın etkinleştirilmesi gerektiğinin nasıl belirtileceği gösterilmektedir.

Dim connectionString As String = "..." & _
    "MultipleActiveResultSets=True"
string connectionString = "..." +
    "MultipleActiveResultSets=True";

Bağlantı dizesine "MultipleActiveResultSets=False" anahtar kelime çiftini ekleyerek MARS'ı devre dışı bırakabilirsiniz. "False", MARS'ın devre dışı bırakılması için tek geçerli değerdir.

MARS Kullanırken Dikkat Edilmesi Gereken Özel Noktalar

Genel olarak, mars özellikli bir bağlantı kullanmak için mevcut uygulamaların değiştirilmesi gerekmez. Ancak, uygulamalarınızda MARS özelliklerini kullanmak istiyorsanız aşağıdaki özel noktaları anlamanız gerekir.

Bildirimlerin Araya Yerleştirilmesi

MARS işlemleri sunucuda zaman uyumlu olarak yürütülür. BULK INSERT ve SELECT deyimlerinin iç içe kullanımına izin verilir. Ancak, veri işleme dili (DML) ve veri tanımı dili (DDL) deyimleri atomik olarak yürütülür. Atomik bir toplu iş yürütülürken yürütülmeye çalışan tüm deyimler engellenir. Sunucuda paralel yürütme bir MARS özelliği değildir.

MARS bağlantısı altında, biri SELECT deyimi, diğeri DML deyimi içeren iki toplu iş gönderilirse, DML, SELECT deyiminin yürütülmesi sırasında yürütülmeye başlayabilir. Ancak, SELECT deyiminin ilerleme kaydedebilmesi için önce DML deyiminin tamamlanması gerekir. Her iki deyim de aynı işlem altında çalışıyorsa, SELECT deyimi yürütülmeye başladıktan sonra bir DML deyimi tarafından yapılan değişiklikler okuma işlemine görünmez.

SELECT deyimi içindeki bir WAITFOR deyimi, beklerken, yani ilk satır oluşturulana kadar işlemi serbest bırakmaz. Bu, bir WAITFOR ifade beklerken aynı bağlantı içinde başka hiçbir toplu işlemin yürütülemeyişini gösterir.

MARS Oturum Önbelleği

MARS etkin bir bağlantı açıldığında sağlayıcı ek yük ekleyen bir mantıksal oturum oluşturur. Bu yükü azaltmak için bağlantı SqlClient başına en fazla 10 MARS oturumu önbelleğe alır. Sınır, kullanıcı tarafından ayarlanamaz. Sınıra ulaşılırsa sağlayıcı hatasız yeni bir oturum oluşturur. Önbellek ve önbelleğin oturumları bağlantılar arasında paylaşılmaz. Kullanımdan sonra, bir oturum önbelleğe döner; ancak önbellek doluysa sağlayıcı bunu kapatır. Önbelleğe alınan oturumların süresi dolmaz; sağlayıcı, bağlantıyı kapattığınızda bunları temizler. Uygulamanın oturumlara ihtiyacı olduğundan sağlayıcı önbelleği doldurur.

Thread Güvenliği

MARS işlemleri iş parçacığı açısından güvenli değildir.

Bağlantı Havuzu

MARS özellikli bağlantılar diğer bağlantılarda olduğu gibi havuzlandırılır. Bir uygulama biri MARS etkin, diğeri MARS devre dışı olan iki bağlantı açarsa, iki bağlantı ayrı havuzlarda olur. Daha fazla bilgi için SQL Server Bağlantı Havuzu (ADO.NET)'ne bakın.

SQL Server Batch Yürütme Ortamı

Bir bağlantı açıldığında, varsayılan ortam tanımlanır. Bu ortam daha sonra mantıksal MARS oturumuna kopyalanır.

Toplu yürütme ortamı aşağıdaki bileşenleri içerir:

  • Seçenekleri ayarlama (örneğin, ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Güvenlik bağlamı (kullanıcı/uygulama rolü)

  • Veritabanı bağlamı (geçerli veritabanı)

  • Yürütme durumu değişkenleri (örneğin, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS@@IDENTITY)

  • Üst seviye geçici tablolar

MARS ile, varsayılan yürütme ortamı bir bağlantıyla ilişkilendirilir. Belirli bir bağlantı altında yürütülmeye başlayan her yeni toplu işlem, varsayılan ortamın bir kopyasını alır. Kod belirli bir toplu iş kapsamında her yürütüldüğünde, ortamda yapılan tüm değişikliklerin kapsamı belirli bir toplu iş olarak belirlenmiştir. Yürütme tamamlandıktan sonra, yürütme ayarları varsayılan ortama kopyalanır. Aynı işlem altında sıralı olarak yürütülecek birkaç komut veren tek bir toplu işlem söz konusu olduğunda, semantikler önceki istemciler veya sunucuları içeren bağlantılar tarafından kullanıma sunulanlarla aynıdır.

Paralel Yürütme

MARS, bir uygulamadaki birden çok bağlantı için tüm gereksinimleri kaldıracak şekilde tasarlanmamıştır. Bir uygulamanın sunucuya yönelik komutların gerçek paralel yürütülmesi gerekiyorsa, birden çok bağlantı kullanılmalıdır.

Örneğin aşağıdaki senaryoları düşünün. Biri sonuç kümesini işlemek, diğeri de verileri güncelleştirmek için olmak üzere iki komut nesnesi oluşturulur; MARS aracılığıyla ortak bir bağlantı paylaşırlar. Bu senaryoda Transaction. Commit ilk komut nesnesinde tüm sonuçlar okunana kadar güncelleştirmede başarısız olur ve aşağıdaki özel durumu verir:

İleti: Başka bir oturum tarafından kullanılan işlem bağlamı.

Kaynak: .NET SqlClient Veri Sağlayıcısı

Beklenen: (null)

Alındı: Microsoft.Data.SqlClient.SqlException

Bu senaryoya yönelik üç seçenek vardır:

  1. Okuyucu oluşturulduktan sonra işlemi başlatarak işlemin bir parçası olmamasını sağlayın. Ardından her güncelleştirme kendi işlemine dönüşür.

  2. Okuyucu kapatıldıktan sonra tüm işleri işleyin. Bu, önemli bir güncelleştirme toplu işlemi potansiyeline sahiptir.

  3. MARS kullanmayın; bunun yerine her komut nesnesi için MARS'ın önünde yaptığınız gibi ayrı bir bağlantı kullanın.

MARS Desteğini Algılama

Bir uygulama değeri okuyarak SqlConnection.ServerVersion MARS desteğini denetleyebilir. Ana sayı SQL Server 2005 için 9 ve SQL Server 2008 için 10 olmalıdır.

Ayrıca bkz.