2017-01-04 23 views
13

Nếu tôi giải mã được bế tắc biểu đồ sau đây một cách chính xác, nó trông giống như hai quá trình (spids: 216 và 209) sở hữu khóa độc quyền (X) trên rất giống page:SQL Server - Làm thế nào cùng một trang có thể được độc quyền (X) bị khóa bởi hai quy trình?

Các XDL <resource-list> lãm

<pagelock 
    fileid="1" 
    pageid="17410848" 
    dbid="21" 
    subresource="FULL" 
    objectname="33bd93e0-f5b2-43f6-93ca-56bbe6493e0c.dbo.sync_publishers2" 
    id="lock630b1d5380" 
    mode="X" 
    associatedObjectId="72057608416264192"> 
    <owner-list> 
     <owner 
      id="process90763f08c8" 
      mode="X" 
      requestType="wait" /> 
    </owner-list> 
    <waiter-list> 
     <waiter 
      id="process861129bc28" 
      mode="X" 
      requestType="wait" /> 
    </waiter-list> 
</pagelock> 

Và một chút nữa xuống

<pagelock 
    fileid="1" 
    pageid="17410848" 
    dbid="21" 
    subresource="FULL" 
    objectname="33bd93e0-f5b2-43f6-93ca-56bbe6493e0c.dbo.sync_publishers2" 
    id="lock630b1d5380" 
    mode="X" 
    associatedObjectId="72057608416264192"> 
    <owner-list> 
     <owner 
      id="process90763f04e8" 
      mode="X" /> 
    </owner-list> 
    <waiter-list> 
     <waiter 
      id="process90763f08c8" 
      mode="X" 
      requestType="wait" /> 
    </waiter-list> 
</pagelock> 

deadlock graph

Làm thế nào nó thậm chí còn p có thể và nó có nghĩa là gì?

Định nghĩa bế tắc đầy đủ có sẵn tại đây: http://pastebin.com/A4Te3Chx.

UPD: Tôi đã đệ trình một mục trên Microsoft Connect để cố gắng thu thập phản ứng có thẩm quyền: https://connect.microsoft.com/SQLServer/Feedback/Details/3119334.

Trả lời

0

Vấn đề này là do biến bảng @tmp bạn đang sử dụng.

Khi bạn sử dụng biến bảng trong truy vấn của mình, kế hoạch được tối ưu hóa cho một hàng sao cho thời điểm công cụ truy vấn của bạn bị khóa một hàng (khéo léo yêu cầu khóa trang) nhưng khóa đã leo thang và thu được khóa trang. bế tắc đã xảy ra.

+0

cảm ơn bạn đã trả lời của bạn, nhưng mục đích của câu hỏi là tìm ra cách cùng một trang có thể được độc quyền khóa bởi hai quy trình khác nhau như biểu đồ bế tắc cho thấy? Tôi không săn lùng bế tắc ở đây. –

+2

[khóa hàng không bao giờ được chuyển đến khóa trang] (https://www.microsoftpressstore.com/articles/article.aspx?p=2233327&seqNum=6) –

9

Điều này chỉ có nghĩa là có hàng chờ đợi trên khóa đó.

Bạn có thể tạo lại nó bằng cách sau (chạy cài đặt và sau đó chuyển tiếp. Sau đó bạn có 15 giây để bắt đầu tran 2 và tran 3 theo thứ tự trong các kết nối khác nhau).

Cài đặt

USE tempdb 

CREATE TABLE T 
    (
    X INT PRIMARY KEY WITH(ALLOW_ROW_LOCKS = OFF), 
    Filler AS CAST('A' AS CHAR(8000)) PERSISTED 
); 

INSERT INTO T VALUES (1), (2), (3); 

Trần 1

SET XACT_ABORT ON 
USE tempdb -- t1 

BEGIN TRAN 

UPDATE T SET X = X WHERE X = 1 

WAITFOR DELAY '00:00:15' 


--See what locks are granted just before the deadlock 
SELECT resource_description, 
     request_status, 
     request_session_id, 
     X 
FROM sys.dm_tran_locks tl 
     LEFT JOIN T WITH(NOLOCK) 
      ON sys.fn_PhysLocFormatter(T.%% physloc%%) = '(' + RTRIM(resource_description) + ':0)' 
WHERE resource_associated_entity_id = (SELECT partition_id 
             FROM sys.partitions 
             WHERE object_id = object_id('T')); 

RAISERROR ('',0,1) WITH NOWAIT; 

UPDATE T SET X = X WHERE X = 3 

WAITFOR DELAY '00:00:20' 
ROLLBACK 

Trần 2

SET XACT_ABORT ON 
USE tempdb -- t2 

BEGIN TRAN 

UPDATE T SET X = X WHERE X = 2 

UPDATE T SET X = X WHERE X = 1 

WAITFOR DELAY '00:00:20' 
ROLLBACK 

Trần 3

SET XACT_ABORT ON 

USE tempdb -- t3 
BEGIN TRAN 

UPDATE T SET X = X WHERE X = 3  

UPDATE T SET X = X WHERE X = 1 

ROLLBACK 

Kết quả của truy vấn đối với tran_locks ngay lập tức trước khi yêu cầu khóa đó sẽ gây ra bế tắc cho thấy

+----------------------+----------------+--------------------+---+ 
| resource_description | request_status | request_session_id | X | 
+----------------------+----------------+--------------------+---+ 
| 4:416    | GRANT   |     61 | 1 | 
| 4:416    | WAIT   |     64 | 1 | 
| 4:416    | WAIT   |     65 | 1 | 
| 4:418    | GRANT   |     64 | 2 | 
| 4:419    | GRANT   |     65 | 3 | 
+----------------------+----------------+--------------------+---+ 

Đồ thị bế tắc tôi nhận được là như sau.

Mặc dù nó cho biết nạn nhân bế tắc đang chờ đợi trên một khóa thuộc sở hữu của tran 2 điều này không thực sự là trường hợp. Tại thời điểm bế tắc, khóa được sở hữu bởi tran 1 và tran 2 trước tiên xếp hàng cho nó trước tran 3.

enter image description here

Bế tắc biểu đồ XML cho thấy điều này vì nó có hai nút cho tài nguyên cùng (trang 416) và trong một "chủ sở hữu" có một requestType="wait"

<resource-list> 
    <pagelock 
     fileid="4" 
     pageid="416" 
     dbid="2" 
     subresource="FULL" 
     objectname="tempdb.dbo.T" 
     id="lock2486d8c4380" 
     mode="X" 
     associatedObjectId="936748728230805504"> 
     <owner-list> 
      <owner 
       id="process2486ba0cca8" 
       mode="X" 
       requestType="wait" /> 
     </owner-list> 
     <waiter-list> 
      <waiter 
       id="process2485370c8c8" 
       mode="X" 
       requestType="wait" /> 
     </waiter-list> 
    </pagelock> 
    <pagelock 
     fileid="4" 
     pageid="416" 
     dbid="2" 
     subresource="FULL" 
     objectname="tempdb.dbo.T" 
     id="lock2486d8c4380" 
     mode="X" 
     associatedObjectId="936748728230805504"> 
     <owner-list> 
      <owner 
       id="process2485370c4e8" 
       mode="X" /> 
     </owner-list> 
     <waiter-list> 
      <waiter 
       id="process2486ba0cca8" 
       mode="X" 
       requestType="wait" /> 
     </waiter-list> 
    </pagelock> 
    <pagelock 
     fileid="4" 
     pageid="419" 
     dbid="2" 
     subresource="FULL" 
     objectname="tempdb.dbo.T" 
     id="lock248636ace80" 
     mode="X" 
     associatedObjectId="936748728230805504"> 
     <owner-list> 
      <owner 
       id="process2485370c8c8" 
       mode="X" /> 
     </owner-list> 
     <waiter-list> 
      <waiter 
       id="process2485370c4e8" 
       mode="X" 
       requestType="wait" /> 
     </waiter-list> 
    </pagelock> 
</resource-list> 
+0

nếu chúng tôi xem xét giao dịch số 2 (SPID 64) không nên sở hữu và đợi hai trang _different_ (tương ứng với X = 1 và X = 2)? Tại sao trông giống như SPID 64 sở hữu và chờ đợi X khóa trên cùng một trang 416 ?! –

+0

@ EugeneD.Gubenkov tại thời điểm bế tắc nó sở hữu một khóa trên trang 418 cho x = 2. Bạn có thể thấy điều này từ đầu ra tran_locks. Tài nguyên đó không liên quan đến bế tắc vì không có giao dịch nào khác đang yêu cầu nó nên không xuất hiện trong biểu đồ bế tắc. Tại sao có vẻ như nó sở hữu và chờ một khóa X trên cùng một trang là bởi vì nó là một hàng đợi. T1 sở hữu tài nguyên, T2 đang chờ nó và T3 cũng đang đợi nó nhưng cần đợi T2 để yêu cầu được cấp và giải phóng khóa đầu tiên. –

+0

Tôi có hiểu chính xác rằng "chủ sở hữu" không phải lúc nào cũng có nghĩa là chủ sở hữu, đôi khi điều đó có nghĩa là người phục vụ? –

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