Triệu chứng
Giả sử bạn tạo Nhóm Sẵn sàng bằng cách sử dụng mệnh đề WITH DTC_SUPPORT = PER_DB trong Microsoft SQL Server. Khi bạn cố gắng thực hiện một tuyên bố SAVE TRANSACTION trong một giao dịch hoặc hệ thống lưu trữ thủ tục như sp_executesql, bạn nhận được một trong các thông báo lỗi sau đây:
Msg 627, Mức 16, Tiểu bang 0, Số Dòng
Không thể sử dụng SAVE TRANSACTION trong một giao dịch được phân phối.
Msg 12324, Cấp 16, Tiểu bang 100, Số Dòng
Các giao dịch được phân phối (DTC) không được hỗ trợ với bảng tối ưu hóa bộ nhớ.
Lỗi: 3933, Mức độ nghiêm trọng: 16, Tiểu bang: 1.
Không thể thúc đẩy giao dịch cho giao dịch được phân phối vì có một điểm lưu hiện hoạt trong giao dịch này.
Nguyên nhân
Khi một cơ sở dữ liệu trong Nhóm Luôn Bật Sẵn sàng được kích hoạt cho WITH DTC_SUPPORT = PER_DB, miễn là một giao dịch liên quan đến nhiều cơ sở dữ liệu, giao dịch đó sẽ được tăng cấp thành giao dịch MSDTC trong SQL Server 2016 SP2 và SQL Server 2017. Có những hạn chế trong giao dịch MSDTC, ví dụ: không thể sử dụng điểm lưu, không thể sử dụng bảng tối ưu hóa bộ nhớ.
Trong một số tình huống giao dịch cơ sở dữ liệu chéo xảy ra không phải vì người dùng có các giao dịch liên quan đến hai cơ sở dữ liệu người dùng, nhưng vì các giao dịch liên quan đến cơ sở dữ liệu hiện tại và cơ sở dữ liệu hệ thống (master, tempdb, mô hình, cơ sở dữ liệu tài nguyên hệ thống). Bởi vì cơ sở dữ liệu tài nguyên hệ thống thực sự là chỉ đọc, nó không phải là cần thiết để thúc đẩy để MSDTC giao dịch nếu một giao dịch chéo cơ sở dữ liệu liên quan đến cơ sở dữ liệu tài nguyên hệ thống nhưng không cơ sở dữ liệu hệ thống khác.
Giải pháp
Bản sửa lỗi được giới thiệu trong KB này bỏ qua khuyến mãi cho giao dịch MSDTC nếu cơ sở dữ liệu tài nguyên hệ thống và cơ sở dữ liệu người dùng là một phần của Nhóm Sẵn sàng được bật cho PER_DB DTC sẽ tham gia vào một giao dịch cơ sở dữ liệu chéo trong cùng một phiên bản SQL Server.
Vì vậy, nếu nguyên nhân ban đầu của các lỗi được liệt kê ở trên là chéo cơ sở dữ liệu giao dịch liên quan đến cơ sở dữ liệu tài nguyên hệ thống, sửa lỗi này sẽ giải quyết nó. Đôi khi, người dùng có thể thấy các lỗi được liệt kê ở trên cùng với cùng một nguyên nhân cơ bản. Sau đây là danh sách các điều kiện áp dụng bản sửa lỗi này:
-
Cơ sở dữ liệu là một phần của Nhóm Luôn Sẵn sàng được bật WITH DTC_SUPPORT = PER_DB.
-
Một giao dịch cơ sở dữ liệu chéo liên quan đến cơ sở dữ liệu này và cơ sở dữ liệu tài nguyên hệ thống SQL Server bản.
-
Bên trong giao dịch cơ sở dữ liệu chéo, SAVE TRANSACTION được sử dụng hoặc tham gia vào các bảng được tối ưu hóa bộ nhớ.
Giao dịch này sẽ không thành công với các lỗi được liệt kê ở trên mà không có bản sửa lỗi này. Với bản sửa lỗi này, giao dịch đó sẽ tiếp tục.
Lưu ý: Bản sửa lỗi này khắc phục các giao dịch chéo cơ sở dữ liệu liên quan đến cơ sở dữ liệu tài nguyên hệ thống, nhưng bất kỳ giao dịch chéo cơ sở dữ liệu liên quan đến cơ sở dữ liệu người dùng và có chứa một câu lệnh SAVE TRANSACTION vẫn sẽ thất bại và phải được viết lại.
Sự cố này đã được khắc phục trong bản cập nhật tích lũy sau đây dành SQL Server:
Mỗi bản cập nhật tích lũy mới dành cho SQL Server sẽ chứa tất cả các bản cập nhật nóng và tất cả các bản sửa lỗi bảo mật được bao gồm trong bản cập nhật tích lũy trước đó. Xem các bản cập nhật tích lũy mới nhất dành cho doanh SQL Server:
Thông tin Bổ sung
Thông tin bổ sung về DTC_SUPPORT = PER_DB, bảng được tối ưu hóa bộ nhớ, SAVE TRANSACTION có thể tìm thấy ở các liên kết sau.
Các giao dịch cơ sở dữ liệu trong cùng một SQL Server thể hiện liên kết phần này 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
bảng tối ưu hóa bộ nhớ liên kết phần này đến https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations nối
kết SAVE TRANSACTION phần này để https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Trạng thái
Microsoft đã xác nhận đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".
Tham khảo
Tìm hiểu về thuật ngữ mà Microsoft sử dụng để mô tả các bản cập nhật phần mềm.