KB4092554 - KHẮC PHỤC: Lỗi 627 hoặc 12324 xảy ra khi giao dịch chéo cơ sở dữ liệu được tăng cấp thành giao dịch phân tán trong Nhóm SQL Server sẵn sàng

Áp dụng cho
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Standard on Windows

Triệu chứng

Giả sử rằng bạn tạo Nhóm sẵn sàng bằng mệnh đề WITH DTC_SUPPORT = PER_DB trong Microsoft SQL Server. Khi bạn cố gắng thực thi câu lệnh SAVE TRANSACTION trong giao dịch hoặc thủ tục lưu trữ hệ thống, chẳng hạn như sp_executesql, bạn sẽ nhận được một trong các thông báo lỗi sau đây:

Lưu ý

Thông báo 627, Mức 16, Trạng thái 0, Số Dòng
Không thể sử dụng SAVE TRANSACTION trong giao dịch phân phối.
Thông báo 12324, Mức 16, Trạng thái 100, Số Dòng
Giao dịch phân phối (DTC) không được hỗ trợ với bảng được tối ưu hóa bộ nhớ.
Lỗi: 3933, Mức độ nghiêm trọng: 16, Trạng thái: 1.
Không thể tăng cấp giao dịch thành giao dịch phân tán 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 Tính sẵn sàng Always On được bật với DTC_SUPPORT = PER_DB, miễn là 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ó các hạn chế trong các giao dịch MSDTC, ví dụ như không thể sử dụng điểm lưu, không thể sử dụng bảng được tối ưu hóa bộ nhớ.

Trong một số trường hợp, giao dịch giữa các cơ sở dữ liệu 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, mà 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, model, cơ sở dữ liệu tài nguyên hệ thống). Vì cơ sở dữ liệu tài nguyên hệ thống thực sự là chỉ đọc, nên không cần thiết phải tăng cấp lên giao dịch MSDTC nếu giao dịch liên cơ sở dữ liệu liên quan đến cơ sở dữ liệu tài nguyên hệ thống chứ không phải các 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 sẽ bỏ qua việc tăng cấp lên 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 kích hoạt cho DTC PER_DB liên quan đến một giao dịch cơ sở dữ liệu chéo trong cùng một phiên bản SQL Server.

Do đó, nếu nguyên nhân ban đầu của các lỗi được liệt kê ở trên là giao dịch giữa các cơ sở dữ liệu liên quan đến cơ sở dữ liệu tài nguyên hệ thống, bản sửa lỗi này sẽ giải quyết sự cố đó. Đôi khi, người dùng có thể thấy các lỗi được liệt kê ở trên với cùng một nguyên nhân cơ bản. Sau đây liệt kê 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 Tính sẵn sàng Luôn Bật VỚI DTC_SUPPORT = PER_DB.
  • Giao dịch giữa các cơ sở dữ liệu liên quan đến cơ sở dữ liệu này và cơ sở dữ liệu tài nguyên hệ thống trong cùng một phiên bản SQL Server.
  • Bên trong giao dịch cơ sở dữ liệu chéo, SAVE TRANSACTION được sử dụng hoặc bảng được tối ưu hóa bộ nhớ có liên quan.

Giao dịch này sẽ không thành công với lỗi được liệt kê ở trên nếu 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 giải quyết các giao dịch liên cơ sở dữ liệu liên quan đến cơ sở dữ liệu tài nguyên hệ thống, tuy nhiên, mọi giao dịch liên quan đến cơ sở dữ liệu người dùng và chứa câu lệnh SAVE TRANSACTION vẫn sẽ không thành công 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 cho SQL Server:

Giới thiệu về các bản cập nhật tích lũy cho SQL Server:

Mỗi bản cập nhật tích lũy mới dành cho SQL Server chứa tất cả các bản sửa lỗi nóng và bản sửa lỗi bảo mật được tích hợp 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 cho SQL Server:

Xem thêm thông tin

Bạn có thể tìm thấy thông tin bổ sung về DTC_SUPPORT = PER_DB, bảng được tối ưu hóa bộ nhớ, SAVE TRANSACTION tại các liên kết sau đây.

Các giao dịch cơ sở dữ liệu trong cùng một phiên bản SQL Server nối kết phần này với 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 được Tối ưu hóa Bộ nhớ liên kết phần này với https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations
LƯU GIAO DỊCH liên kết phần này với https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks

https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-replication-for-always-on-availability-groups-sql-server?view=sql-server-2017#step2

Trạng thái

Microsoft đã xác nhận rằng đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong mục "á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.