อาการ
สมมติว่า คุณสร้างกลุ่มความพร้อมใช้งาน โดยใช้ส่วนคําสั่ง WITH DTC_SUPPORT = PER_DB ใน microsoft SQL Server เมื่อคุณพยายามดําเนินการคําสั่ง SAVE TRANSACTION ในทรานแซคชันหรือกระบวนการที่เก็บไว้ของระบบ เช่น sp_executesql คุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
Msg 627, ระดับ 16, สถานะ 0, LineNumber
ไม่สามารถใช้ SAVE TRANSACTION ภายในธุรกรรมที่กระจายได้
Msg 12324, ระดับ 16, รัฐ 100, LineNumber
ธุรกรรมที่แจกจ่าย (DTC) จะไม่ได้รับการสนับสนุนกับตารางที่ปรับให้เหมาะสมหน่วยความจํา
ข้อผิดพลาด: 3933 ความรุนแรง: 16 รัฐ: 1
ไม่สามารถเลื่อนระดับธุรกรรมเป็นธุรกรรมที่กระจายได้ เนื่องจากมีจุดบันทึกที่ใช้งานอยู่ในธุรกรรมนี้
สาเหตุ
เมื่อฐานข้อมูลในกลุ่มความพร้อมใช้งานเสมอถูกเปิดใช้งานสําหรับ WITH DTC_SUPPORT = PER_DB ตราบใดที่ทรานแซคชันเกี่ยวข้องกับหลายฐานข้อมูล ทรานแซคชันจะเลื่อนระดับเป็นทรานแซคชัน MSDTC ใน SQL Server 2016 SP2 และ SQL Server 2017 มีข้อจํากัดในธุรกรรม MSDTC ตัวอย่างเช่น ไม่สามารถใช้จุดบันทึกได้ ไม่สามารถใช้ตารางที่ปรับให้เหมาะสมกับหน่วยความจําได้
ในบางสถานการณ์ ทรานซิชันข้ามฐานข้อมูลไม่ได้เกิดขึ้นเนื่องจากผู้ใช้มีธุรกรรมที่เกี่ยวข้องกับฐานข้อมูลผู้ใช้สองฐานข้อมูล แต่เนื่องจากธุรกรรมเกี่ยวข้องกับฐานข้อมูลปัจจุบันและฐานข้อมูลระบบ (หลัก tempdb แบบจําลอง ฐานข้อมูลทรัพยากรระบบ) เนื่องจากฐานข้อมูลทรัพยากรของระบบเป็นแบบอ่านอย่างเดียวจึงไม่จําเป็นต้องเลื่อนระดับเป็นทรานแซคชัน MSDTC ถ้าทรานแซคชันข้ามฐานข้อมูลเกี่ยวข้องกับฐานข้อมูลทรัพยากรระบบ แต่ไม่ใช่ฐานข้อมูลระบบอื่นๆ
การแก้ไข
การแก้ไขที่แนะนําใน KB นี้จะข้ามการเลื่อนระดับไปยังทรานแซคชัน MSDTC ถ้าฐานข้อมูลทรัพยากรระบบและฐานข้อมูลผู้ใช้ที่เป็นส่วนหนึ่งของกลุ่มความพร้อมใช้งานที่เปิดใช้งานสําหรับPER_DB DTC จะเกี่ยวข้องกับทรานแซคชันข้ามฐานข้อมูลภายในอินสแตนซ์SQL Serverเดียวกัน
ดังนั้น ถ้าสาเหตุดั้งเดิมของข้อผิดพลาดที่แสดงข้างต้นเป็นทรานแซคชันข้ามฐานข้อมูลที่เกี่ยวข้องกับฐานข้อมูลทรัพยากรระบบ บางครั้งผู้ใช้อาจเห็นข้อผิดพลาดที่แสดงอยู่ด้านบนที่มีสาเหตุพื้นฐานเหมือนกัน ต่อไปนี้จะแสดงเงื่อนไขที่นําการแก้ไขนี้ไปใช้:
-
ฐานข้อมูลเป็นส่วนหนึ่งของกลุ่มความพร้อมใช้งานเสมอที่เปิดใช้งานด้วย DTC_SUPPORT = PER_DB
-
ทรานแซคชันฐานข้อมูลแบบไขว้เกี่ยวข้องกับฐานข้อมูลนี้และฐานข้อมูลทรัพยากรระบบในอินสแตนซ์SQL Serverเดียวกัน
-
ภายในทรานแซคชันข้ามฐานข้อมูล จะมีการใช้ SAVE TRANSACTION หรือใช้ตารางที่ปรับให้เหมาะสมกับหน่วยความจํา
การทําธุรกรรมดังกล่าวจะล้มเหลวโดยมีข้อผิดพลาดที่ระบุไว้ข้างต้นโดยไม่ต้องแก้ไขนี้ ด้วยการแก้ไขนี้ธุรกรรมดังกล่าวควรดําเนินการต่อ
หมายเหตุ: การแก้ไขนี้แก้ไขทรานแซคชันข้ามฐานข้อมูลที่เกี่ยวข้องกับฐานข้อมูลทรัพยากรระบบ แต่ทรานแซคชันข้ามฐานข้อมูลใดๆ ที่เกี่ยวข้องกับฐานข้อมูลของผู้ใช้และมีคําสั่ง SAVE TRANSACTION จะยังคงล้มเหลวและต้องเขียนใหม่
ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตแบบสะสมต่อไปนี้สําหรับ SQL Server:
แต่ละปรับปรุงสะสมใหม่สําหรับSQL Serverประกอบด้วยโปรแกรมแก้ไขด่วนทั้งหมด และการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการปรับปรุงสะสมก่อนหน้านี้ ดูการอัปเดตแบบสะสมล่าสุดสําหรับSQL Server:
ข้อมูลเพิ่มเติม
ข้อมูลเพิ่มเติมเกี่ยวกับ DTC_SUPPORT = PER_DB, ตารางที่ปรับหน่วยความจําให้เหมาะสม, SAVE TRANSACTION สามารถพบได้ที่ลิงก์ต่อไปนี้
ทรานสชันฐานข้อมูลภายในอินสแตนซ์SQL Serverเดียวกันจะเชื่อมโยงส่วนนี้เข้ากับ 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-instance
ตารางที่ปรับให้เหมาะสมกับหน่วยความจํา https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsเชื่อมโยงบันทึกทรานแซคชันไปยังส่วนนี้ไปยัง https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"
อ้างอิง
เรียนรู้เกี่ยวกับ คําศัพท์เฉพาะทาง ที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์