Điều gì đang chặn và làm thế nào nó xảy ra?


20

Tôi đã cố gắng tìm một số thông tin về việc chặn trong SQL Server, nhưng tôi không thể tìm thấy lời giải thích ngắn gọn cho nó là gì và nó xảy ra như thế nào. Bạn có thể vui lòng khai sáng cho tôi?

Câu trả lời:


23

Tương tự

Đôi khi nó giúp sử dụng các chất tương tự ra khỏi máy tính.

Giả sử bạn có một quả bóng và hai đứa trẻ. Chỉ có một đứa trẻ có thể có bóng bất cứ lúc nào. Tuy nhiên, nếu một trong những đứa trẻ nhận được bóng và không buông nó ra vì nó bị phân tâm (ví dụ như xem TV), thì đứa trẻ kia sẽ không được chơi với quả bóng.

Đứa trẻ khác bị chặn từ tài nguyên đó.

Ví dụ, nếu chúng ta so sánh điều này với TV, một số trẻ em có thể xem TV tại bất kỳ điểm nào.

Khóa

Nếu chúng ta chuyển sang thế giới cơ sở dữ liệu, chúng ta sẽ thấy rằng có nhiều cách khác nhau để sử dụng tài nguyên (giống như hai ví dụ của chúng tôi ở trên). Chúng ta có thể thực hiện "đọc" hoặc chúng ta có thể thực hiện "ghi".

Khi chúng tôi muốn đọc dữ liệu, không có lý do gì mà người khác không thể đọc dữ liệu cả - giống như hai người đang xem TV. Tuy nhiên, nếu chúng ta muốn viết dữ liệu, thì chúng ta cần đảm bảo rằng không ai khác đang nhìn vào nó. Nếu họ đang đọc nó trong khi chúng tôi viết nó, họ sẽ nhận được những lần đọc "bẩn". (Có nghĩa là họ sẽ thấy dữ liệu được ghi một phần, sẽ không hợp lệ.)

Để đảm bảo rằng những lần đọc bẩn này không bao giờ xảy ra, chúng tôi có hai loại khóa chính là Khóa đọc và Khóa độc quyền.

Đọc khóa

Bạn có thể có một số kết nối khác nhau đọc từ cùng một nguồn dữ liệu tại bất kỳ thời điểm nào. Nhưng để đảm bảo rằng không ai thay đổi dữ liệu đó trong khi họ đang đọc dữ liệu đó, họ lấy ra Khóa đọc.

Khi một kết nối có khóa đọc trên một phần dữ liệu, tất cả các kết nối khác phải đợi cho đến khi Khóa đọc được phát hành trước khi chúng có thể ghi dữ liệu. Tuy nhiên, những người khác có thể lấy ra Khóa đọc của chính họ trên cùng một dữ liệu.

Khóa độc quyền

Nếu một kết nối muốn cập nhật / chèn / xóa một phần dữ liệu, họ phải lấy ra một khóa độc quyền. Điều này ngăn bất kỳ kết nối nào khác cũng lấy ra một khóa trên dữ liệu (làm cho khóa độc quyền với kết nối đó).

Khi một kết nối có khóa độc quyền trên dữ liệu, không có kết nối nào khác có thể đọc được từ dữ liệu. Điều này giúp ngăn chặn việc đọc bẩn bằng cách đảm bảo rằng không ai có thể đọc dữ liệu trong khi nó được ghi.

Chặn

"Chặn" chỉ đơn giản là một thuật ngữ có nghĩa là một kết nối đang giữ khóa trên tài nguyên khi một kết nối khác muốn đọc hoặc ghi vào nó. Điều đó không nhất thiết có nghĩa là kết nối chủ sở hữu sẽ không phát hành nó, chỉ là nó hiện đang giữ nó.

So sánh điều này với trường hợp với một đứa trẻ cầm bóng. Đứa trẻ cầm bóng đang chặn tất cả những đứa trẻ khác cầm bóng.

Bế tắc

Tôi biết bạn đã không hỏi điều này, nhưng đó chỉ là một bước nữa để đi đến bế tắc (và nó liên quan rất trực tiếp đến việc chặn).

Bế tắc có thể xảy ra khi bạn có hai kết nối mà mỗi kết nối có một khóa, nhưng chúng muốn tài nguyên của nhau. Trong kịch bản này, nó giống như hai đứa trẻ mỗi đứa có một quả bóng, nhưng lại muốn quả bóng kia.

Giống như trẻ em, những kết nối này không sẵn sàng để chia sẻ. Mỗi kết nối cần truy cập vào cả hai tài nguyên để tiếp tục. Tuy nhiên, họ đang ở trong tình trạng bị chặn vĩnh viễn. Ở trạng thái này, cha mẹ (DBMS) phải đến và chọn một người thua cuộc để một trong những đứa trẻ (kết nối) có thể có quyền truy cập vào cả hai tài nguyên.

Khi kết nối "chiến thắng" được thực hiện, nó sẽ giải phóng các tài nguyên và sau đó kết nối ("mất") khác có thể thử lại để đến cả hai tài nguyên.

Vì vậy, khái niệm về sự bế tắc là nơi bạn có hai tài nguyên đang chặn nhau.


Tại đây , bạn có thể đọc thêm về tất cả các loại khóa khác nhau mà SQL Server phải cung cấp và các tài nguyên khác nhau có thể gây ra chặn / bế tắc. Bài viết này đã cũ, nhưng nó vẫn áp dụng cho SQL Server 2000 đến 2008 R2. (Có thêm một vài loại khóa được thêm vào các phiên bản SQL Server mới hơn, nhưng điều đó sẽ cho bạn một điểm khởi đầu.)


1
@Richard, như bạn đã đề cập nếu xảy ra bế tắc, thì DBMS sẽ đến và chọn một người thua cuộc .. Điều này có được DBMS thực hiện tự động không? Hay một hệ thống được thiết kế kém (một hệ thống thường xuyên gặp bế tắc) sẽ dừng lại cho đến khi một người khởi tạo DBMS để làm như vậy?
CenterOrbit

2
Đối với SQL Server, việc này được thực hiện tự động (miễn là cơ sở dữ liệu có thể phát hiện bế tắc ). Nó có thể gặp khó khăn khi phát hiện ra nó, ví dụ, nếu nó thực sự là một khóa trực tiếp .
Richard

Câu trả lời tuyệt vời và rất kỹ lưỡng Richard. Một điểm bổ sung trên các khóa trực tiếp (không thực sự được so sánh hoặc liên quan đến các khóa chết, đó chỉ là khóa cũ đơn giản) ... SQL sẽ ngăn các khóa tiếp theo được thực hiện khi khóa độc quyền đang chờ, IIRC sau 4 khóa chia sẻ chồng chéo liên tiếp.
Mark Storey-Smith

5

Giải thích tuyệt vời của Richard, nhưng chỉ muốn thêm liên kết đến tài liệu chính thức. Các chủ đề này được viết cho SQL Server 2000, nhưng phần lớn các khái niệm vẫn giữ nguyên cho đến ngày nay:

Hiểu và tránh chặn

Hiểu khóa trong SQL Server

Chỉnh sửa - một số bổ sung:

Cả 3 đều là các tác giả và / hoặc MVP SQL Server rất nổi tiếng.

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.