2009-05-30 65 views
5

tôi đã đọc vấn đề khóa chết này Khi các bảng cơ sở dữ liệu bắt đầu tích lũy hàng nghìn hàng và nhiều người dùng bắt đầu làm việc trên cùng một bảng, các truy vấn SELECT trên các bảng bắt đầu tạo ra các tranh chấp khóa và các giao dịch deadlocks.cách giải quyết vấn đề bế tắc?

Đây có phải là sự cố bế tắc liên quan đến việc cập nhật TransactNo không? Nếu bạn biết vấn đề này, hãy cho tôi biết xin. Cảm ơn trước.

Trả lời

3

Bạn chưa cung cấp đủ thông tin để trả lời câu hỏi của mình trực tiếp.

Nhưng hầu hết khóa và chặn có thể được giảm (hoặc thậm chí bị loại bỏ) bằng cách có chỉ mục 'chính xác' để bao gồm khối lượng công việc truy vấn của bạn.

Do bạn có công việc duy trì chỉ mục thường xuyên được lên lịch?

Nếu bạn có SELECT s không cần chính xác 100% (nghĩa là cho phép đọc bẩn ...) thì bạn có thể chạy một số SELECTS với WITH(NOLOCK), tương tự như mức độc lập READ UNCOMMITED. Xin lưu ý: Tôi không đề xuất bạn đặt WITH(NOLOCK) ở mọi nơi; chỉ trên những SELECTS không cần dữ liệu nguyên vẹn 100%.

4

Một bế tắc có thể xảy ra vì nhiều lý do, do đó bạn sẽ phải làm một ít bài tập về nhà trước nếu bạn muốn được giúp đỡ và cho chúng tôi biết nguyên nhân gây ra bế tắc. các lô liên quan đến việc thực thi bế tắc là gì, tài nguyên nào có liên quan và vân vân và vân vân. Các Profiler deadlock event graph luôn luôn là một nơi tuyệt vời để bắt đầu điều tra.

Nếu tôi muốn chụp ảnh trong bóng tối, các truy vấn và chỉ mục của bạn không được điều chỉnh chính xác, vì vậy hầu hết các hoạt động đọc của bạn (và có lẽ một số ghi) là quét toàn bộ bảng và do đó được đảm bảo va chạm với các bản cập nhật. Điều này có thể gây ra deadlocks by order of index access, bế tắc theo thứ tự các hoạt động, bế tắc bằng cách leo thang, v.v.

Khi bạn xác định được nguyên nhân gây ra bế tắc thì có thể thực hiện hành động thích hợp để xóa nó. Các trường hợp khi anh ta hành động thích hợp là để nghỉ mát để đọc bẩn là cực kỳ hiếm.

BTW Tôi không chắc chắn ý của bạn là 'TransactNo updlock'. Bạn có yêu cầu cụ thể về số S-U/U-S asymmetry of the U locks không?

4

Một vấn đề phổ biến với cách ly cao là khóa leo thang bế tắc do các kịch bản sau đây; I E.(Trong đó X là bất kỳ tài nguyên, chẳng hạn như liên tiếp)

  • SPID một lần đọc X - được đọc khóa
  • SPID b đọc X - được một khóa đọc
  • SPID một nỗ lực để cập nhật X - bị chặn bởi b của đọc khóa, vì vậy phải đợi
  • nỗ lực b SPID để cập nhật X - chặn bởi một khóa là đọc, vì vậy phải đợi

Deadlock! Kịch bản này có thể tránh được bằng cách lấy hơn khóa:

  • SPID một lần đọc X với (UPDLOCK) quy định - được một khóa độc quyền
  • SPID b cố gắng đọc X - chặn bởi một là khóa độc quyền, vì vậy phải đợi
  • SPID một nỗ lực để cập nhật X - mỹ
  • ... (SPID một cam kết/cuộn lại, và phát hành các khóa tại một số điểm)
  • ... (SPID b làm bất cứ điều gì nó muốn làm)
+0

Leo thang khóa là khi động cơ quyết định từ bỏ việc lấy các khóa dạng hạt riêng lẻ và quyết định lấy khóa thô mức cao hơn. Khóa leo thang chuyển từ khóa cấp hàng sang khóa cấp bảng. Một dấu hiệu câu chuyện của một khóa tắc nghẽn leo thang là sự tham gia của tôi khóa (khóa dự định) khi leo thang cố gắng để có được ổ khóa thực sự trên bàn và nó sẽ xung đột với các ổ khóa ý định khác nhau (S-IX, S-IS) đã được đặt trên nó . Ví dụ của bạn là đọc kinh điển theo sau là viết, nó không liên quan đến việc leo thang. –

+0

Nếu tôi sử dụng thuật ngữ sai, thì tôi xin lỗi; nhưng kịch bản (bằng tên bất kỳ) là một vấn đề phổ biến. –

3

tôi sẽ ném bài báo và bài viết của riêng tôi vào trộn về sự bế tắc:

http://sqlblog.com/blogs/jonathan_kehayias/archive/tags/Deadlock/default.aspx

Tôi cũng có một loạt các video trên xử lý sự cố deadlocking trên JumpstartTv.com cũng như:

http://jumpstarttv.com/profiles/1379/Jonathan-Kehayias.aspx

Lỗi kết nối có thể khó giải quyết, nhưng trừ khi bạn đăng thông tin biểu đồ bế tắc của mình, chúng tôi không thể làm gì nhiều hơn là cung cấp liên kết đến bài đăng và thông tin về giải quyết câu trả lời khóa.

8

Lỗi dừng có thể xảy ra vì nhiều lý do và đôi khi khắc phục sự cố deadlocks có thể mang tính nghệ thuật hơn là khoa học.

Những gì tôi sử dụng để tìm và loại bỏ các bế tắc, bên ngoài SQL Profiler đơn giản, là một công cụ nhẹ cung cấp mô tả đồ họa về các bế tắc khi chúng xảy ra. Khi bạn thấy bế tắc, bạn có thể xem chi tiết và nhận thông tin giá trị. Deadlock Detector - http://www.sqlsolutions.com/products/sql-deadlock-detector

Đó là một công cụ đơn giản, nhưng đối với tôi, nó thực hiện chính xác những gì nó được cho là phải làm. Một điều: lần đầu tiên tôi sử dụng nó, tôi đã phải đợi 15 phút để công cụ thu thập đủ số liệu để bắt đầu hiển thị deadlocks.

Các vấn đề liên quan