Belirtiler
Microsoft SQL Server'da WITH DTC_SUPPORT = PER_DB yan tümcesini kullanarak bir Kullanılabilirlik Grubu oluşturduğunuzu varsayalım. bir işlemde veya sp_executesql gibi sistem saklı yordamlarında SAVE TRANSACTION deyimi yürütmeye çalıştığınızda, aşağıdaki hata iletilerinden birini alırsınız:
Msg 627, Düzey 16, State 0, Line LineNumber
SAVE TRANSACTION dağıtılmış bir işlem içinde kullanılamaz.
Msg 12324, Düzey 16, State 100, Line LineNumber
Dağıtılmış işlemler (DTC), bellek için iyileştirilmiş tablolarda desteklenmez.
Hata: 3933, Önem Derecesi: 16, Durum: 1.
Bu işlemde etkin bir kaydetme noktası olduğundan işlem dağıtılmış bir işleme yükseltilemiyor.
Neden
Always On Kullanılabilirlik Grubundaki bir veritabanı WITH DTC_SUPPORT = PER_DB için etkinleştirildiğinde, bir işlem birden çok veritabanı içerdiği sürece, işlem SQL Server 2016 SP2 ve SQL Server 2017'de MSDTC işlemine yükseltilir. MSDTC işlemlerinde sınırlamalar vardır, örneğin kaydetme noktaları kullanılamaz, bellek için iyileştirilmiş tablolar kullanılamaz.
Bazı durumlarda veritabanları arası işlemler, kullanıcıların iki kullanıcı veritabanını içeren işlemleri olduğundan değil, geçerli veritabanı ve sistem veritabanlarını (ana, tempdb, model, sistem kaynak veritabanı) içerdiğinden gerçekleşir. Sistem kaynak veritabanı aslında salt okunur olduğundan, veritabanları arası bir işlem sistem kaynak veritabanını içeriyorsa ancak diğer sistem veritabanlarını içermiyorsa MSDTC işlemine yükseltilmesi gerekmez.
Çözüm
Sistem kaynak veritabanı ve PER_DB DTC için etkinleştirilmiş bir Kullanılabilirlik Grubunun parçası olan bir kullanıcı veritabanı aynı SQL Server örneği içindeki veritabanları arası bir işleme dahilse, bu KB'de sunulan düzeltme MSDTC işlemine yükseltmeyi atlar.
Bu nedenle, yukarıda listelenen hataların özgün nedeni sistem kaynak veritabanını içeren veritabanları arası işlemse, bu düzeltme sorunu çözer. Bazen kullanıcı yukarıda listelenen hataları aynı temel nedenle görebilir. Bu düzeltmenin geçerli olduğu koşullar aşağıda listelemektedir:
-
Veritabanı, with DTC_SUPPORT = PER_DB ile etkinleştirilen Always On Kullanılabilirlik Grubunun bir parçasıdır.
-
Veritabanları arası işlem, bu veritabanını ve sistem kaynak veritabanını aynı SQL Server örneğinde içerir.
-
Veritabanları arası işlemin içinde SAVE TRANSACTION kullanılır veya bellek için iyileştirilmiş tablolar dahil edilir.
Bu tür işlemler, bu düzeltme olmadan yukarıda listelenen hatalarla başarısız olur. Bu düzeltme ile bu tür işlemler devam etmelidir.
Not: Bu düzeltme, sistem kaynak veritabanını içeren veritabanları arası işlemleri giderir, ancak kullanıcı veritabanlarını içeren ve SAVE TRANSACTION deyimi içeren veritabanları arası işlemler yine başarısız olur ve yeniden yazılması gerekir.
Bu sorun, SQL Server için aşağıdaki toplu güncelleştirmede düzeltildi:
SQL Server için her yeni toplu güncelleştirme, önceki toplu güncelleştirmede yer alan tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. SQL Server için en son toplu güncelleştirmelere göz atın:
Ek Bilgi
DTC_SUPPORT = PER_DB, bellek için iyileştirilmiş tablolar, SAVE TRANSACTION hakkında ek bilgileri aşağıdaki bağlantılarda bulabilirsiniz.
Aynı SQL Server örneği içindeki veritabanı işlemleri bu bölümü
https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-2017#sql-server-2016-sp1-and-before-support-for-cross-database-transactions-within-the-same-sql-server-instanceBellek için İyileştirilmiş Tablolar bağlantısına bağlar
https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsSAVE TRANSACTION bu bölümü https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks bağla
Durum
Microsoft bu sorunun "Uygulandığı öğe" bölümünde listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır.
Başvurular
Microsoft'un yazılım güncelleştirmelerini açıklamak için kullandığı terminoloji hakkında bilgi edinin.