Tôi có cụm Luôn bật của SQL Server 2019, chứa Nhóm khả dụng gồm 3 bản sao ở chế độ Đồng bộ.
Dựa theo tài liệu của Microsoft:
- Bản sao phụ làm cứng nhật ký và trả lại xác nhận cho bản sao chính.
- Khi nhận được xác nhận từ bản sao phụ, bản sao chính kết thúc quá trình xử lý cam kết và gửi thông báo xác nhận tới máy khách.
bài viết này đi vào chi tiết hơn và giải thích rằng:
- Trong bản sao phụ, Nhận nhật ký nhận các bản ghi nhật ký từ bản sao chính và ghi vào bộ đệm Nhật ký. Quá trình này được lặp lại trên mỗi bản sao phụ tham gia vào chế độ cam kết đồng bộ.
- Trên mỗi bản sao phụ, luồng Làm lại tồn tại và nó ghi tất cả các thay đổi được đề cập trong bản ghi nhật ký vào trang dữ liệu và trang chỉ mục. Nó xóa nhật ký để làm cứng nhật ký cơ sở dữ liệu thứ cấp.
- Như đã nêu trước đó, trong cam kết dữ liệu đồng bộ, bản sao chính chờ xác nhận từ bản sao phụ. Ở giai đoạn này, bản sao thứ cấp sẽ gửi xác nhận rằng quá trình xử lý cứng giao dịch đã hoàn tất trên bản sao thứ cấp.
- Sau khi Bản sao chính nhận được xác nhận từ bản sao phụ, nó sẽ gửi thông báo hoàn thành giao dịch tới máy khách.
Vì vậy, nếu tôi hiểu đúng:
Nếu tôi cập nhật thành công một bản ghi qua Bản sao chính, thì giá trị được cập nhật này sẽ là ngay lập tức có sẵn cho khách hàng truy vấn các bản sao thứ cấp.
Tuy nhiên, khi tôi kiểm tra điều này, cái này không hoạt động nên.
Tôi chạy một tệp bó đơn giản, trông như thế này:
sqlcmd -E -S tcp:SQL-AG-Listener -d TestDB -Q "BẮT ĐẦU GIAO DỊCH; CẬP NHẬT TestSyncTable SET CurrentTime='%currentTime%'; CAM KẾT GIAO DỊCH;"
sqlcmd -E -S tcp:SQL-Server01 -d TestDB -Q "CHỌN * TỪ TestSyncTable" -K ReadOnly
sqlcmd -E -S tcp:SQL-Server02 -d TestDB -Q "CHỌN * TỪ TestSyncTable" -K ReadOnly
sqlcmd -E -S tcp:SQL-Server03 -d TestDB -Q "CHỌN * TỪ TestSyncTable" -K ReadOnly
Vì vậy, tôi đang cập nhật Thời điểm hiện tại
trường thông qua bản sao Chính (lưu trữ Trình nghe AG) và sau đó đọc nó ngay lập tức qua cả ba bản sao. Mỗi sqlcmd
lệnh là một quy trình máy khách riêng biệt, do đó, nó sẽ mở kết nối TCP độc lập của riêng mình.
Và sau đó tôi thấy một cái gì đó như thế này:
SQL-Server01: Thời gian hiện tại = 20:02:19,93
SQL-Server02: Thời gian hiện tại = 20:02:16,94
SQL-Server03: Thời gian hiện tại = 20:02:19,93
(Đã định dạng lại đầu ra để dễ đọc hơn tại đây)
Theo những gì tôi thấy, bản sao Chính luôn trả về giá trị được cập nhật. Và các lớp thứ hai cũng vậy - nhưng chỉ có một số độ trễ ngắn.
Vì vậy, câu hỏi là: tại sao? Chế độ Đồng bộ có nên đảm bảo rằng kết quả của thao tác đọc phù hợp với thao tác ghi không? Nếu bản sao phụ chỉ gửi xác nhận sau khi chuỗi Làm lại của nó cập nhật trang dữ liệu - thì làm sao có thể?
Cảm ơn,
chất nhày.