Tôi đang đối mặt với một số bế tắc xảy ra lại, một trong số đó là Khóa phím và chứa truy vấn CHỌN với gợi ý XLOCK trở thành nạn nhân bế tắc. Câu lệnh còn lại là một CHERTN vào một trong các bảng là một phần của khung nhìn của truy vấn đầu tiên.
Lượt xem:
create view dbo.viewE
as
select * from dbo.E
where myValue > 13000
Chọn truy vấn:
select * from dbo.viewE with (XLOCK) where A > GETUTCDATE()
Tuyên bố INSERT:
INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate())
Bảng bên dưới dbo.E đang giữ khoảng 3 triệu hàng trong khoảng 20 cột, một số trong số đó là ntext.
Lấy các truy vấn ra và mô phỏng nó bằng tay với hai giao dịch, hành vi được tái sản xuất. Hành vi thay đổi nếu XLOCK bị xóa khỏi phần chọn.
Đồ thị bế tắc:
<deadlock-list>
<deadlock victim="process222222221">
<process-list>
<process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" XDES="0x2f1ec5ca0" lockMode="RangeX-X" schedulerid="15" kpid="12936" status="suspended" spid="359" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2015-09-14T16:32:36.160" lastbatchcompleted="2015-09-14T16:32:36.160" clientapp="x" hostname="x" hostpid="14536" loginname="x" isolationlevel="serializable (4)" xactid="27202256401" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="48" sqlhandle="0x02000000611e4523142b2318c47c87313a9b2ba587ff3130">
SELECT * FROM viewE WITH (XLOCK) WHERE A < GetUtcDate() </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@UICulture nvarchar(5))SELECT * FROM viewE WITH (XLOCK) WHERE A < GetUtcDate() </inputbuf>
</process>
<process id="process6022222" taskpriority="0" logused="161152" waitresource="KEY: 5:72057604035644444 (cd874c2ba438)" waittime="1370" ownerId="27202248438" transactionguid="0x8de5ccd6eeef67469c6234af59e44ca5" transactionname="DTCXact" lasttranstarted="2015-09-14T16:32:34.767" XDES="0x4aa0bf950" lockMode="RangeI-N" schedulerid="14" kpid="6636" status="suspended" spid="329" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2015-09-14T16:32:37.300" lastbatchcompleted="2015-09-14T16:32:37.300" clientapp="x" hostname="x" hostpid="14536" loginname="x" isolationlevel="read uncommitted (1)" xactid="27202248438" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="936" sqlhandle="0x020000004853462f09790a4ddedc0d574c2afa539aef1c0e">
INSERT INTO [E] ([a], [b], [c],...) VALUES (@aDate, @bDate, @c, ...)
</frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>INSERT INTO [E] ([a], [b], [c],...) VALUES (@aDate, @bDate, @c, ...)
</inputbuf>
</process>
</process-list>
<resource-list>
<keylock hobtid="72057604035644444" dbid="5" objectname="db.dbo.E" indexname="IX_index1" id="lock258b6dc80" mode="X" associatedObjectId="72057604035644444">
<owner-list>
<owner id="process6022222" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process222222221" mode="RangeX-X" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057604035644444" dbid="5" objectname="db.dbo.E" indexname="IX_index1" id="lock7b145c400" mode="RangeX-X" associatedObjectId="72057604035644444">
<owner-list>
<owner id="process222222221" mode="RangeX-X"/>
</owner-list>
<waiter-list>
<waiter id="process6022222" mode="RangeI-N" requestType="wait"/>
</waiter-list>
</keylock>
</resource-list>
</deadlock>
</deadlock-list>
Theo tôi hiểu điều này, tôi đang xem xét một bế tắc KEYLOCK về cơ bản gây ra bởi một truy vấn chỉ mục chưa được phát hiện sử dụng một chỉ mục không được bao gồm và một cụm để thu thập các giá trị cần thiết, phải không?
Những câu hỏi của tôi:
- Tôi không thể tạo chỉ mục bao phủ vì các cột NTEXT được yêu cầu có liên quan. Sẽ giảm mạnh số lượng hàng giúp ở đây?
- Có lý do chính đáng nào mà tôi không biết CHỌN được thực thi với XLOCK không? Bế tắc cũng sẽ xảy ra mà không có XLOCK?