2009-03-19 47 views
32

Tất cả các tài liệu trên SQL Server bế tắc đàm phán về kịch bản, trong đó hoạt động 1 ổ khóa tài nguyên A sau đó cố gắng truy cập vào tài nguyên B và hoạt động 2 ổ khóa tài nguyên B và cố gắng để truy cập vào tài nguyên Một .deadlocks SQL Server giữa chọn/cập nhật hoặc nhiều Selects

Tuy nhiên, tôi khá thường xuyên thấy sự bế tắc giữa một lựa chọn và một bản cập nhật hoặc thậm chí giữa nhiều chọn trong một số ứng dụng bận rộn của chúng tôi. Tôi tìm thấy một số các điểm tốt hơn của đầu ra dấu vết bế tắc khá không thể hiểu được nhưng tôi thực sự chỉ muốn hiểu những gì có thể gây ra một bế tắc giữa hai hoạt động đơn lẻ. Chắc chắn nếu một lựa chọn có khóa đọc thì bản cập nhật chỉ nên đợi trước khi lấy khóa độc quyền và ngược lại?

Điều này đang xảy ra trên SQL Server 2005 không phải là tôi nghĩ điều này tạo nên sự khác biệt.

Trả lời

11

khi tôi đánh dấu một bài viết tốt về Advanced SQL Server locking tại SQL-Server-Performance.com. Bài viết đó vượt ra ngoài tình trạng bế tắc cổ điển mà bạn đã đề cập và có thể cung cấp cho bạn một số thông tin chi tiết về vấn đề của bạn.

0

Bạn nên đọc lên trên cô lập giao dịch: http://msdn.microsoft.com/en-us/library/ms173763.aspx

+0

Tôi hiểu về mức cách ly, các deadlocks ở trên có thể được giải quyết bằng cách chọn BUT được chọn không được cam kết tại sao một bản đọc bắt đầu TRƯỚC KHI bản cập nhật kết thúc bằng bế tắc với bản cập nhật đó bằng đọc đã cam kết? –

1

Đọc đúng về giao dịch và mức độ cách ly: cho một tác phẩm trung tính hơi dày đặc nhưng khá kỹ lưỡng và công nghệ, xem Principles of Transaction Processing. Nó làm rung chuyển thế giới của tôi (và đã cho tôi một vài cơn đau đầu!).

Tôi không chắc chắn những gì bạn đang gặp rắc rối với, hoặc mức độ cô lập bạn đang sử dụng. Nhưng hãy xem xét điều này: cho tất cả các công cụ cơ sở dữ liệu biết, nếu bạn đọc trong một giao dịch, làm thế nào nó có thể cho biết có hay không bạn sẽ làm một viết sau này? Mức cô lập cao yêu cầu khóa bất cứ khi nào đọc xong, có thể trên toàn bộ bảng để bảo vệ chống lại các lần đọc ma, vì dữ liệu có thể ảnh hưởng đến việc ghi sau này.

Bạn có muốn cơ sở dữ liệu đợi lâu tùy ý cho khóa độc quyền trên dữ liệu của mình không? Hãy xem xét mức độ cô lập của bạn trong suốt, và cho dù bạn đang chạy không cần thiết một loạt các lần đọc như là một giao dịch bị cô lập. Nó không phải luôn luôn dễ dàng để xác định cách bẩn thỉu lần đọc bạn có thể chịu đựng được, mặc dù ...

+2

Tôi nghĩ rằng các câu hỏi áp phích cụ thể hơn là một lời nói chung về mức cô lập có thể chữa khỏi. – eckes

+0

Tôi sẽ không mô tả chính xác PoTP như là một rant. Rob đặc biệt yêu cầu giúp đỡ trong việc hiểu về giao dịch, và dường như có một số khó khăn trong việc hiểu sự cân bằng liên quan. Nếu chỉ ra các tài liệu hữu ích là ranting, sau đó tôi có thể tạo bọt ở miệng tất cả các thời gian! YMMV. –

5

Locks giữa các truy vấn duy nhất có thể xảy ra khi họ khóa hàng duy nhất, không phải toàn bộ bảng:

Truy vấn cập nhật được một bản cập nhật khóa trên một vài hàng trong một bảng và truy vấn chọn sẽ nhận khóa đọc trên một số hàng khác trong bảng. Truy vấn cập nhật sau đó cố gắng để có được một khóa cập nhật trên các hàng được đọc bị khóa, và truy vấn chọn cố gắng để có được một khóa đọc trên các hàng được cập nhật bị khóa.

Nó thậm chí còn phức tạp hơn với ổ khóa leo thang, tức là cơ sở dữ liệu quyết định rằng có quá nhiều hàng đơn bị khóa bởi giao dịch để nó được leo thang vào khóa một phần của bảng hoặc toàn bộ bảng. Điều này có nghĩa là khóa có thể ảnh hưởng đến các hàng không liên quan trực tiếp đến truy vấn.

19

Điều này có thể xảy ra vì một chọn một cái khóa ra trên hai chỉ số khác nhau, trong khi đó một bản cập nhật có một khóa trên các chỉ số tương tự theo thứ tự ngược lại. Lựa chọn cần hai chỉ mục vì chỉ mục đầu tiên không bao gồm tất cả các cột mà nó cần truy cập; bản cập nhật cần hai chỉ mục vì nếu bạn cập nhật cột khóa của chỉ mục, bạn cần phải có khóa trên đó.

http://blogs.msdn.com/bartd/archive/2006/09/25/770928.aspx có một lời giải thích tuyệt vời. Các bản sửa lỗi được đề xuất bao gồm thêm chỉ mục bao gồm tất cả các cột mà lựa chọn cần chọn, chuyển sang chế độ cô lập ảnh chụp nhanh hoặc buộc phải chọn chọn lấy khóa cập nhật mà thông thường nó không cần.

12

Tôi ngạc nhiên không ai đề cập đến đề xuất khóa WITH (UPDLOCK). Nó rất hữu ích nếu bạn có deadlocks liên quan đến ví dụ hai cặp chọn-chèn chạy song song.

Trong SQL Server, nếu bạn phát hành các lựa chọn với WITH (UPDLOCK), lựa chọn thứ hai sẽ đợi cho đến khi lựa chọn đầu tiên kết thúc. Nếu không họ sẽ nhận được khóa chia sẻ, và khi họ đồng thời cố gắng nâng cấp lên ổ khóa độc quyền, họ bế tắc.

+0

'Rolf Kristensen' giải thích' WITH (UPDLOCK) 'một cách hoàn hảo trong câu trả lời của mình. – Mahmoodvcs

4

Đoán của tôi là câu lệnh chọn tập hợp khóa đọc, khi bạn đi kèm với bản cập nhật, thì cần nâng cấp lên khóa ghi.

Việc nâng cấp lên khóa ghi yêu cầu phải xóa tất cả các khóa đọc khác (Các giao dịch lựa chọn của họ hoàn tất). Nhưng nếu một quy trình khác đã có ý tưởng tuyệt vời để nâng cấp lên khóa ghi, thì bạn đột nhiên có hai quy trình chờ nhau để giải phóng khóa đọc, để họ có thể nhận được khóa ghi.

Nếu sử dụng chọn-để-cập nhật (UPDLOCK) thì nó sẽ chứa một khóa ghi từ đầu và sau đó bạn không có vấn đề bế tắc.

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