Khóa ngoại có thể gây ra bế tắc và cản trở ĐỌC SNAPSHOT?


19

Đây là câu hỏi tiếp theo từ: /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically

Mặc dù vậy, tôi vẫn gặp tình huống bế tắc / hết thời gian trong ứng dụng ASP.NET khi chạy các báo cáo lớn đồng thời READ_COMMITTED_SNAPSHOT ON.

Vì vậy, tôi có hai câu hỏi:

  1. Làm cách nào tôi có thể kiểm tra xem Ảnh chụp nhanh Cấp độ Cách ly Giao dịch có hoạt động như mong đợi / không?
  2. Tôi giả sử rằng các khóa ngoại (trong các bảng của Ứng dụng web cho các bảng báo cáo) chịu trách nhiệm cho các khóa chết. Tôi tìm thấy bài viết thú vị này :

Lưu ý SQL Server có được các khóa được chia sẻ khi xác thực các khóa ngoại, ngay cả khi giao dịch đang sử dụng ảnh chụp nhanh đã cam kết (đọc cam kết sử dụng phiên bản hàng) hoặc mức cô lập ảnh chụp nhanh. Hãy chú ý điều này khi kiểm tra biểu đồ khóa chết từ các giao dịch khi các mức cô lập giao dịch này được sử dụng. Nếu bạn thấy các khóa được chia sẻ, hãy kiểm tra xem liệu các khóa được lấy trên một đối tượng được tham chiếu bởi khóa ngoại.

Làm cách nào tôi có thể kiểm tra xem FK có thực sự chịu trách nhiệm cho các tình huống Bế tắc / Hết giờ không, điều đó có nghĩa là tôi có thể xóa các khóa ngoại đó để ngăn chặn bế tắc (điều gì sẽ là một nỗ lực chấp nhận được)?

Lưu ý : Tôi chỉ đọc từ các bảng gây ra bế tắc.

Bất kỳ suy nghĩ về chủ đề này được đánh giá rất cao.


Chỉnh sửa Dưới đây là một đồ thị bế tắc . Có lẽ ai đó có thể giúp tôi hiểu những gì gây ra bế tắc. Có vẻ như nó xảy ra mà không có bất kỳ báo cáo nào chạy chỉ do ứng dụng web gây ra, khi hai giao dịch muốn ghi cùng một bảng (một bản cập nhật và một lần chèn, phần chèn là dưới dạng Thủ tục lưu trữ). Tại sao nó lại khóa trang và làm thế nào để chỉ khóa hàng? Chèn-SP đã sử dụng TRANSACTION ISOLATION LEVEL REPEATABLE READ.

Tôi có một nghi ngờ mạnh mẽ rằng hai kích hoạt (một cập nhật và một chèn) chịu trách nhiệm cho các bế tắc. Đây là trình kích hoạt chèn:

CREATE TRIGGER [dbo].[CreateRMAFiDates] 
   ON  [dbo].[RMA] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE RMA 
    SET [fiCreationDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text),
        [fiPopDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
        [fiManufactureDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Manufacture_Date, 112) = tdefDate.Text)
    FROM INSERTED;
END

Vì vậy, trình kích hoạt này cập nhật Bảng RMA, nguyên nhân khiến trình kích hoạt cập nhật kích hoạt (điều tương tự). Liệu đồ thị bế tắc có xác nhận giả định của tôi không? Tôi nghĩ rằng tôi sẽ xóa các kích hoạt đó và tạo một SP đang chạy mỗi ngày một lần, điều đó là hoàn toàn đủ, bởi vì các cột này chỉ dành cho SSAS-Cube (Molap).

Chỉnh sửa : Nhân tiện, không còn bế tắc nữa kể từ khi tôi xóa các kích hoạt này :)

Câu trả lời:


16

Nếu nhóm SQLCAT nói rằng xác thực FK được thực hiện bằng cách sử dụng cách ly cam kết đọc, thì họ phải biết họ đang nói về điều gì. Nhấn mạnh vào xác nhận . Câu hỏi thực sự là tại sao một báo cáo sẽ kích hoạt xác nhận FK ? Xác nhận xảy ra trên ghi , và các báo cáo được cho là được đọc . Các báo cáo của bạn đang gây ra ghi, trong trường hợp đó, các mức cô lập ảnh chụp nhanh sẽ không giúp được gì, nguyên nhân của sự bế tắc là khác nhau.

Cách duy nhất để đạt được tiến bộ là ghi lại biểu đồ khóa chết.

Đối với câu hỏi khác, làm thế nào bạn có thể kiểm tra nếu bạn hoạt động trong sự cô lập ảnh chụp nhanh: nhìn vào sys.dm_tran_active_snapshot_database_transactions.


2

Xác nhận chính nước ngoài thể xảy ra dưới (khóa) đọc cam kết cho đúng đắn. Xem Ảnh chụp cách ly: Mối đe dọa cho tính toàn vẹn? của Hugo Kornelis để biết chi tiết.

Biểu đồ khóa chết hiển thị hai lần thực thi đồng thời RM2.dbo.RMAgây ra bế tắc. Kích hoạt của bạn đang thiếu một điều kiện tham gia giữa RMAinserted.

Có vẻ như đây là một sự giám sát và trình kích hoạt của bạn đang vô tình cập nhật tất cả các hàng trong tình RMAtrạng bế tắc rất có thể xảy ra nếu có nhiều hơn một lần thực thi kích hoạt đồng thời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.