Tôi đã gặp phải một vấn đề liên quan đến giao dịch trên cơ sở dữ liệu sản xuất SQL Server 2008. Một tổng quan ngắn gọn là chúng tôi có một trang web có nhiều người dùng đồng thời trên toàn tiểu bang, những người làm công việc loại GUI (Thêm bản ghi, sửa đổi, xem, v.v.) thông qua một trang web ASP.Net.
Mỗi lần chèn và cập nhật được thực hiện trong Giao dịch riêng, được xử lý bởi lớp truy cập dữ liệu. Tôi tin rằng sự cô lập cơ sở dữ liệu được đặt thành Read_Commited.
Tất cả đều hoạt động tốt.
Tuy nhiên, một mô-đun mới đã được thêm vào, trong đó thăm dò một cơ sở dữ liệu riêng để biết thông tin. Nếu có thông tin mới, một quy trình sẽ bắt đầu một giao dịch mới và sử dụng cùng một mã truy cập dữ liệu để đọc từ cơ sở dữ liệu của chúng tôi, cũng như đọc từ một cơ sở dữ liệu riêng biệt khác cho thông tin mới. Sau đó, nó thực hiện vô số kiểm tra để xem nó phải làm gì với dữ liệu mới ... Và bắt đầu thực hiện vô số cập nhật hoặc chèn vào cơ sở dữ liệu của chúng tôi. Đây là tất cả trong một giao dịch lớn. Tất cả các chèn và cập nhật từ cả ứng dụng UI và dịch vụ bỏ phiếu đều trải qua các quy trình CRUD giống nhau. Vì một tin nhắn đến được xử lý có thể chứa rất nhiều thực thể cần cập nhật, thời gian để giao dịch hoàn thành có thể nằm trong khoảng thời gian một giây và một phút.
Mặc dù vậy, điều chúng tôi tìm thấy là khi một tin nhắn lớn hơn được xử lý, giao diện người dùng sẽ khóa và có thể khóa cho người dùng trong 3 phút.
Vì vậy, chúng tôi nghĩ rằng có thể thêm gợi ý 'NOLOCK' vào các lựa chọn có thể hỗ trợ. Nó đã không. Chà, nó có thể đã giúp một chút, nhưng việc khóa máy vẫn đang diễn ra.
Tôi nghĩ rằng nguyên nhân có thể là do tin nhắn đến và một giao dịch được bắt đầu, điều này đang khóa các giao dịch khác hoạt động (Ngay cả các câu lệnh CHỌN mà tôi không hiểu). Cấu hình cơ sở dữ liệu cho thấy rằng ngay cả các lựa chọn đơn giản cũng mất nhiều thời gian để hoàn thành trên UI (Đơn giản, chẳng hạn nhưSELECT fields FROM SingleTable WHERE PrimaryKey = Value
Các chỉ mục của chúng tôi có vẻ ổn ... Chúng tôi có Triggers trên tất cả các bảng chỉ cần sao chép các cập nhật và chèn vào bảng cơ sở dữ liệu AUDIT. Đừng nghĩ họ là vấn đề.
Tôi nghĩ đó là vì giao dịch xung quanh quá trình xử lý tin nhắn đang khóa giao diện người dùng.
Bất cứ ai cũng có thể chia sẻ kinh nghiệm hoặc cho tôi biết nơi tôi có thể tìm kiếm để xem lý do tại sao chúng tôi bị khóa giao diện người dùng? UI nên được ưu tiên. Xử lý tin nhắn là một điều cơ bản ... người dùng cần được ưu tiên ... nhưng có vẻ như các tin nhắn đang khóa cơ sở dữ liệu ... và chúng tôi không chắc chắn liệu UI có khóa xử lý tin nhắn không.
Hy vọng ai đó có thể giúp đỡ. Tôi có thể cung cấp càng nhiều thông tin càng tốt để giúp đỡ.