徵兆
假設您在 Microsoft SQL Server 中使用WITH DTC_SUPPORT = PER_DB子句建立可用性群組。 當您嘗試在交易或系統中執行 SAVE TRANSACTION 語句時,例如 sp_executesql,您會收到下列其中一個錯誤訊息:
Msg 627、層級 16、州/市 0、LineNumber
無法在分散式交易中使用 SAVE TRANSACTION。 Msg 12324、層級 16、州/市 100、Line LineNumber 記憶體優化的表格不支援分散式交易 (DTC) 。 錯誤:3933,嚴重性:16,狀態:1. 無法將交易升級為分散式交易,因為此交易中有作用中的儲存點。原因
在 Always On Availability Group 中的資料庫啟用WITH DTC_SUPPORT = PER_DB時,只要交易涉及多個資料庫,交易就會在 SQL Server 2016 SP2 和 SQL Server 2017 中升級為 MSDTC 交易。 MSDTC 交易有一些限制,例如無法使用儲存點、無法使用記憶體優化的資料表。
在某些情況下,發生跨資料庫交易的並非因為使用者有涉及兩個使用者資料庫的交易,而是因為交易涉及目前的資料庫和系統資料庫, (主資料庫、範本、模型、系統資源資料庫) 。 系統資源資料庫實際上只會讀取,因此,如果跨資料庫交易涉及系統資源資料庫,而非其他系統資料庫,則不需要升級為 MSDTC 交易。
解決方案
此 KB 中所引入的修正程式會在系統資源資料庫和已啟用PER_DB DTC 可用性群組的使用者資料庫,在同一個SQL Server實例中涉及跨資料庫交易時,跳過對 MSDTC 交易的促銷。
因此,如果上述所列錯誤的原始原因是涉及系統資源資料庫的跨資料庫交易,此修正程式將會解決此問題。 有時候,使用者可能會看到上面列出的錯誤具有相同的根本原因。 下列列出適用此修正的條件:
-
資料庫是啟用 WITH DTC_SUPPORT = PER_DB 的Always On可用性群組的一部分。
-
跨資料庫事務涉及此資料庫和系統資源資料庫的相同SQL Server實例。
-
在跨資料庫交易中,會使用 SAVE TRANSACTION,或包含記憶體優化的資料表。
如果發生上述錯誤,若沒有此修正程式,這類交易將會失敗。 透過此修正程式,這類交易應該會繼續進行。
注意:此修正程式解決涉及系統資源資料庫的跨資料庫交易,但任何涉及使用者資料庫且包含 SAVE TRANSACTION 語句的跨資料庫交易仍會失敗,且必須重新寫入。
此問題已在下列SQL Server累積更新中修正:
每個SQL Server的新累積更新都包含所有 Hotfix 以及先前累積更新隨附的所有安全性修正。 查看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#limitationsSAVE TRANSACTION會將此部分連結至HTTPs://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
狀態
Microsoft 已確認<適用於>一節中所列的 Microsoft 產品確實有上述問題。
參考資料
瞭解 Microsoft 用來描述軟體更新的 術語 。