Aracılığıyla paylaş


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

Bir veya daha fazla varsa, saklı yordam, Yayımcı tarafında yürütmekk ve yayımlanmış tabloları etkileyen s olanlar da dahil olmak üzere göz önünde saklı yordamyayınınızdaki s saklı yordam yürütmek makaleleri.Abonelik 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 adresindeki ilgili yordamı yürütür.Yalnızca yordam çalıştırmayı çoğaltıldığından, her satır için tek tek değişiklikleri çoğaltmak gerek atlayarak bu durumlarda burada büyük toplu iş iş işlemleri gerçekleştirilir, önemli ölçüde daha iyi performans sağlar.Örneğin, aşağıdaki oluşturmak 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 yüzde 10'u ödeme artırma şirketinizde verir.Zaman, yürütmek Bu saklı yordam yayımcı adresindeki, o maaş her çalışan için güncelleştirir.Çoğaltmayı olmadan saklı yordam yürütme, güncelleştirme gönderilmesini abonelere büyük, multi-step bir hareket olarak:

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ütme çoğaltmayla çoğaltma yalnızca tüm güncelleştirmeler, yazmak yerine abone saklı yordamı yürütmek için komut gönderir dağıtım veritabanı sonra ağ üzerinden abone ile göndererek:

EXEC give_raise
Önemli notÖnemli

Saklı yordam çoğaltma tüm uygulamalar için uygundur.Yayımcı adresindeki abone adresindeki satırları farklı ayarlar böylece makale yatay olarak, filtre edilmesi durumunda aynı yürütme saklı yordam her ikisi de farklı sonuçlar verir.Benzer şekilde, bir güncelleştirme, başka çoğaltılmamış bir alt sorguyu temel alıyorsa, tablo, aynı yürütme saklı yordamı her iki yayımcı adresindeki ve abone farklı sonuçlar verir.

Saklı yordam yürütme yayımlamak için

Abone adresindeki yordamı değiştirme

Varsayılan olarak, her abone için yayımcı adresindeki saklı yordam tanım yayılır.Ancak, saklı yordam abone adresindeki değişiklik yapabilirsiniz.Yayımcı ve abone yürütülecek farklı mantık istiyorsanız bu yöntem yararlıdır.Örneğin, göz önünde sp_big_delete, bir saklı yordam iki işlevi vardır Yayımcı adresindeki: 1,000,000 satır çoğaltılmış siler tablo big_tablo1 çoğaltılmamış güncelleştirir ve tablo big_tablo2.İsteğe bağlı ağ kaynaklarını azaltmak için 1 milyon satır silme saklı yordam ile yayımlamayı yaymak sp_big_delete.Abone tarafında değiştirebileceğiniz sp_big_delete 1 milyon satır silmek için sonraki güncelleştirme gerçekleştirmek değil big_table2.

Not

Varsayılan olarak, abone için Yayımcı tarafında alter procedure kullanılarak yapılan herhangi bir değişiklik yayılır.Bunu önlemek için şema değişiklikleri yayılmasını alter procedure yürütmeden önce devre dışı bırakın.Şema değişiklikleri hakkında daha fazla bilgi için bkz: Yayını veritabanları üzerinde şeması değişiklikler yapma.

Saklı yordam yürütme makaleleri türleri

Saklı yordam yürütme yayımlanabilir iki farklı yolu vardır: seri hale getirilebilir yordamı yürütme makale ve yordamı yürütme makale.

  • Seri hale getirilebilir seçeneği yalnızca yordam seri hale getirilebilir bir işlem bağlamı içinde yürütülürse yordamı yürütme çoğaltıldığı için önerilir.Saklı yordam dışında bir seri hale getirilebilir işlem yürütülür, dml deyimlerini bir dizi olarak yayımlanan tablolardaki verilerde değişiklikler çoğaltılır.Bu davranış, veri Abone tarafında Yayımcı veri ile tutarlı yapmak için katkıda bulunmaktadır.Bu büyük temizleme işlemleri gibi toplu iş iş işlemler için kullanışlıdır.

  • Yordamı yürütme seçeneği ile yürütme saklı yordam tek tek ifadelerine başarılı olursa olsun, tüm abonelerine çoğaltılan mümkündür.Ayrıca, veri için saklı yordam tarafından yapılan değişiklikler nedeniyle meydana gelebilir birden çok işlem veri aboneleri yayımcı adresindeki veri ile tutarlı olmayabilir.Bu sorunları gidermek için gerekli olduğu abonelerin salt okunurdur ve yalıtım düzey read UNCOMMITTED büyük kullanın.Read UNCOMMITTED kullanırsanız, dml deyimlerini bir dizi olarak yayımlanan tablolardaki verilerde değişiklikler ç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.

Onu önerildiği aşağıdaki örnekte gösterilmektedir, sizin küme çoğaltma yordamları seri hale getirilebilir yordam makaleleri olarak yukarı.

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, hareket T1 select hareket T2 INSERT önce olmuyor varsayılır.

Seri hale getirilebilir bir hareket içinde yordamı yürütüp yürütmediğinizi (yalıtım düzey küme SERIALIZABLE için), hareket T2 izin T1 deyim aralık içinde yeni bir satır eklemek için ve T1 önce tamamlanması.Bu da onu T1 önce abone adresindeki uygulanacak gelir.T1 Abone tarafında uygulandığında, select Yayımcı adresindeki'den farklı değer iade ve Update farklı bir sonuca yol açabilir.

Yordam seri hale getirilebilir bir hareket içinde yürütülürse, hareket T2 select tarafından kapsanan aralıktaki eklemek için izin verilmez deyim T2 içinde.Abone adresindeki aynı sonuçlar sağlayarak T1 tamamlar kadar engellenir.

Uzun zaman kilit tutulan, yürütmek yordam seri hale getirilebilir bir hareketin içinde azaltılmış eşzamanlılık neden olabilir.

xact_abort ayarı

Saklı yordam yürütme oturum ayarı, saklı yordamı yürütme çoğaltma yapılırken xact_abort on deyimini belirtmeniz gerekir.xact_abort off için küme ve yayımcı adresindeki yordamı yürütme sırasında bir hata oluşursa, Dağıtım Aracısı başarısız olmasına neden olan Abone tarafında aynı hata ortaya çıkar.xact_abort on deyimini belirterek, Dağıtım Aracısı hata önleme, geri Yayımcı nedeni tüm yürütme yürütmesi sırasında karşılaşılan hataları sağlar.xact_abort ayarı hakkında daha fazla bilgi için bkz: set xact_abort (Transact-SQL).

Kapalı xact_abort ayarı gerektiriyorsa belirtmek - skiperrors parametresi Dağıtım Aracısı için.Bu aracı bir hatayla karşılaşılması durumunda bile abone adresindeki değişiklikler uygulayarak devam etmek izin verir.Bu parametre hakkında daha fazla bilgi için bkz: İşlemsel kopyalama hatalar atlanıyor.