Aracılığıyla paylaş


Işlem çoğaltma, yayımlama saklı yordamı yürütme

Bu saklı yordamlar olarak saklı yordam yürütme makaleleri yayınınızdaki dahil olmak üzere, Yayımcı tarafında yürütmek ve yayımlanmış tabloları etkileyen bir veya daha fazla saklı yordamlar, göz önünde bulundurun.Aboneliğin yeniden başlatıldığında, yordam (CREATE PROCEDURE deyim) tanımını için abone çoğaltılır; yordamı Yayımcı tarafında çalıştırıldığında, çoğaltma abone altında ilgili yordamı çalıştırır..Bu, yalnızca yordamı yürütme çoğaltıldığından, tek tek her satır için değişiklikleri Çoğalt gerek atlayarak büyük toplu iş iş işlemleri nerelerde gerçekleştirildiği, servis taleplerini önemli ölçüde daha iyi performans sağlayabilirsiniz.Örneğin, aşağıdaki oluşturduğunuz varsayalım saklı yordam yayın veritabanında:

CREATE PROC give_raise AS
UPDATE EMPLOYEES SET salary = salary * 1.10

Bu yordamı her 10.000 çalışanların bir yüzde 10 ödeme artırma şirketinizdeki sağlar.Zaman, yürütmek bu yordam sırasında yayımcı depolanan, onu her çalışan için maaş güncelleştirir.saklı yordam yürütülmesinin çoğaltma, güncelleştirme büyük, multi-step hareketi olarak abonelerine gönderilecek:

BEGIN TRAN
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 1'
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 2'

Ve bu 10.000 güncelleştirmeler için yineler.

saklı yordam yürütülmesinin çoğaltması ile çoğaltma yalnızca saklı yordam, abone yerine tüm güncelleştirmeleri dağıtım veritabanına yazma ve abone için ağ üzerinden göndermeden sonra yürütülecek komutu gönderir:

EXEC give_raise
Important noteImportant Note:

saklı yordam çoğaltma, tüm uygulamalar için uygun değil.makale yatay satır en Yayımcı Abone tarafında farklı ayarlar böylece süzülür, aynı yürütme saklı yordam sırasında her ikisi de farklı sonuçlar döndürüyor.Benzer şekilde, bir güncelleştirme üzerinde başka bir alt sorgunun temel alıyorsa, yayımcı ve abonelik sırasında aynı saklı yordam yürütülüyor nonreplicated tablosu, farklı sonuçlar verir.

saklı yordam yürütülmesini yayımlamak için

Abone adresindeki yordamı değiştirme

Varsayılan olarak, saklı yordam tanımı yayımcı sırasında her abone için yayılır.Ancak, aynı zamanda değiştirebileceğiniz saklı yordam abone adresindeki.Bu özellik, yayımcı ve abone yürütülecek farklı mantığı istiyorsanız kullanışlıdır.Örneğin, göz önünde bulundurun sp_big_delete, iki işlev bulunur yayımcı adresindeki bir saklı yordam: Bu yinelenmiş bir tabloda 1,000 satırları silerbig_table1 ve nonreplicated tablo güncelleştirir.big_table2.Ağ kaynaklarındaki talep azaltmak için 1 milyon satıra silme saklanan bir yordamın ile yayımlamayı yaymak sp_big_delete.Abone tarafında değiştirebilirsiniz sp_big_delete sonraki güncelleştirme gerçekleştirmek yalnızca 1 milyon satırları silmek içinbig_table2.

Not

Varsayılan olarak, ALTER PROCEDURE Yayımcı tarafında kullanılarak yapılan değişiklikler için abone yayılır.Bunu önlemek için , ALTER PROCEDURE çalıştırmadan önce şema değişikliklerini yayılmasını devre dışı bırakın.Şema değişiklikleri hakkında daha fazla bilgi için bkz: Üzerinde yayın Databases şema değişiklikleri yapma.

Saklı yordam yürütme zimmetli malların türleri

saklı yordam yürütülmesini yayımlanabilir iki farklı yolu vardır: Yürütme makale seri hale getirilebilir bir yordam ve yordamın yürütme makalesi (ingilizce).

  • Seri hale getirilebilir seçeneği yalnızca, yordamı seri hale getirilebilir bir işlem bağlamında çalıştırılır, yordamı yürütme çoğaltır önerilir.saklı yordam seri hale getirilebilir bir hareketin gelen çalıştırılır, yayımlanmış bir tablodaki verilerde değişiklikler DML deyimlerini bir dizi olarak çoğaltılır.Bu davranış, veri Abone tarafında yayımcı veri tutarlı yapmak için katkıda bulunmaktadır.Bu, özellikle büyük temizleme işlemleri gibi toplu iş iş işlemler için kullanışlıdır.

  • Yordamı yürütme seçeneğiyle yürütülmesine bakılmaksızın, saklı yordam tek tek deyimleri başarılı tüm aboneleri için çoğaltılması olanaklıdır.Saklı yordam tarafından yapılan değişiklikleri verileri Ayrıca, birden çok işlemler içinde abonelerin veri yayımcı veri tutarlı olmayabilir oluşabilir.Bu sorunları gidermek için , zorunludur aboneleri salt okunurdur ve kaydedilmeyen okuma büyük bir yalıtım düzey kullanın.Kaydedilmeyen okuma kullanırsanız, yayımlanmış bir tablodaki verilerde değişiklikler DML deyimlerini bir dizi olarak çoğaltılır.Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: Veritabanı Altyapısı'nda yalıtım düzeyleri.

Önerilir bu nedenle, aşağıdaki örnekte gösterilmektedir, küme kurma yordamları olarak seri hale getirilebilir yordamı makaleleri çoğaltma.

BEGIN TRANSACTION T1
SELECT @var = max(col1) FROM tableA
UPDATE tableA SET col2 = <value> 
   WHERE col1 = @var 

BEGIN TRANSACTION T2
INSERT tableA VALUES <values>
COMMIT TRANSACTION T2

Önceki örnekte, önce işlem T2 INSERT olmuyor SEÇME işlem T1 varsayılır.

Yordamı seri hale getirilebilir bir işlemde (SERIALIZABLE için ayarlanan yalıtım düzey ile) gerçekleştirildiğinde değil, hareket T2 SEÇME aralık içinde yeni bir satır eklemek için izin verilecek deyim T1 ve onu önce T1 kaydedilmeye.Bu, ayrıca, en önce T1 abone uygulanacağını gösterir.T1 Abone tarafında uygulandığında, SELECT olası yayımcı daha farklı bir değer döndürebilir ve GÜNCELLEŞTIRMENIN'den farklı bir sonuca neden olabilir.

Yordamı seri hale getirilebilir bir işlem içinde gerçekleştirildiğinde, hareket T2 T2 SELECT deyiminde tarafından kapsanan aralıktaki eklemeye izin verilmez.Aynı sonuçlar sırasında abone olma T1 tamamlar kadar engellenir.

Seri hale getirilebilir bir işlem içinde yordamını yürütün ve sınırlı eşzamanlılık neden olabilir, kilitleri uzun bekletilir.

XACT_ABORT ayarı

saklı yordam yürütme çoğaltılıyor, saklı yordamı yürütmek oturum ayarı XACT_ABORT ON belirtmeniz gerekir.Aynı hata, XACT_ABORT KAPALı olarak küme ve yürütme sırasında yayımcı yordamının sırasında bir hata oluşur, Abone tarafında dağıtım aracı başarısız olmasına neden ortaya çıkar.XACT_ABORT ON belirtme, dağıtım aracısını hata önleme yürütme sırasında geri, Yayımcı nedeni tüm yürütme sırasında karşılaşılan hataları sağlar.XACT_ABORT ayarlama hakkında daha fazla bilgi için bkz: küme XACT_ABORT (Transact-SQL).

Ayarı KAPALı XACT_ABORT gerektiriyorsa, belirttiğiniz -SkipErrors Dağıtım Aracısı ile ilgili parametre.Bu, bile bir hatayla karşılaştı abone sırasında değişiklikleri uygulamadan devam etmek bu aracı sağlar.Bu parametre hakkında daha fazla bilgi için bkz: Işlem çoğaltma hatalar atlanıyor..