Câu trả lời:
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.)
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:
Chỉnh sửa - một số bổ sung:
Five Way to Fight Blocking Video - một video rất mới từ Kendra Little (xuất bản ngày hôm nay)
DBA là Thám tử: Khắc phục sự cố Khóa và Chặn - bởi Rodney Landrum
Cách xác định các vấn đề chặn với SQL Profiler - của Brad McGehee
Cả 3 đều là các tác giả và / hoặc MVP SQL Server rất nổi tiếng.