2012-01-09 51 views
6

Tôi hỏi câu hỏi này vì thỉnh thoảng tôi bị bế tắc mà tôi không hiểu.Khi nào là bế tắc không phải là bế tắc?

Đây là kịch bản:

Stored Procedure mà cập nhật bảng A:

UPDATE A 
SET A.Column = @SomeValue 
WHERE A.ID  = @ID 

Stored Procedure mà chèn vào một #temp bảng temp:

INSERT INTO #temp (Column1,Column2) 

SELECT B.Column1, A.Column2 

FROM B 

INNER JOIN A 
    ON A.ID = B.ID 

WHERE B.Code IN ('Something','SomethingElse') 

tôi thấy rằng có thể có thể là một sự chờ đợi khóa nhưng tôi không thấy làm thế nào một bế tắc sẽ xảy ra, tôi thiếu một cái gì đó hiển nhiên?

EDIT:

Các SPs mà tôi đã gõ ở đây rõ ràng là đơn giản hóa các phiên bản nhưng tôi đang sử dụng các cột có liên quan. Cấu trúc của cả hai bảng sẽ là:

CREATE TABLE A (ID IDENTITY 
        CONSTRAINT PRIMARY KEY, 
       Column VARCHAR (100)) 


CREATE TABLE B (ID IDENTITY 
        CONSTRAINT PRIMARY KEY, 
       Code VARCHAR (100)) 
+3

'cập nhật' đang chờ' chèn vào' để kết thúc và 'chèn vào' đang chờ' cập nhật' kết thúc? Cả hai chờ người khác kết thúc! –

+0

Nếu cả Bản cập nhật và Phụ trang đều chống lại cùng một bảng, trừ khi câu lệnh Chèn cố gắng đặt khóa độc quyền trên TẤT CẢ các bảng có liên quan và không chỉ trên #temp một số – Gixonita

+1

http://www.codinghorror.com/blog/2008/ 08/deadlocked.html –

Trả lời

1

Hãy thử điều này từ khóa causeing nó chỉ định cho các bảng tên gợi ý bảng và từ khóa:

WITH(NOLOCK) 

Vì vậy, một số điều như thế này cho kịch bản của bạn:

INSERT INTO #temp (Column1,Column2) 

    SELECT B.Column1, A.Column2 

FROM B WITH(NOLCOK) 

INNER JOIN A WITH(NOLOCK) 
    ON A.ID = B.ID 

WHERE B.Code IN ('Something','SomethingElse') 

Xem cách bạn thực hiện.

Bạn có thể tra cứu bảng gợi ý cũng cho tsql, máy chủ sql để xem cái nào phù hợp nhất với bạn. Một trong những tôi đã chỉ định NOLCOK sẽ không gây ra khóa và cũng có thể nó sẽ bỏ qua các hàng bị khóa như một số quá trình khác đang sử dụng chúng, vì vậy nếu bạn không quan tâm bạn có thể sử dụng nó.

Tôi không chắc chắn với các bảng tạm thời nhưng bạn cũng có thể sử dụng các gợi ý bảng với INSERT, INSERT INTO WITH (TABLE_HINT).

+1

Xin chào Pasha, tôi đã kết thúc bằng cách sử dụng tùy chọn (NOLOCK) đã giải quyết vấn đề (Vui lòng nhận xét về câu hỏi, có một liên kết đến một bài viết nổi bật mà tôi đã sử dụng để quyết định sử dụng gợi ý (NOLOCK)). Tôi đánh dấu đây là câu trả lời vì nó thực sự là những gì tôi đã làm và không ai khác đăng nó như là một "câu trả lời". Cảm ơn :) – Gixonita

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