मैं कुछ फिर से होने वाले गतिरोधों का सामना कर रहा हूं, जिनमें से एक कीलॉक है और इसमें XLOCK संकेत के साथ एक चयन क्वेरी है जो गतिरोध का शिकार बन जाता है। अन्य कथन एक तालिका में एक INSERT है जो पहली क्वेरी के दृश्य का हिस्सा है।
राय:
create view dbo.viewE
as
select * from dbo.E
where myValue > 13000
क्वेरी का चयन करें:
select * from dbo.viewE with (XLOCK) where A > GETUTCDATE()
INSERT कथन:
INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate())
अंतर्निहित तालिका dbo.E लगभग 20 स्तंभों में लगभग 3 मिलियन पंक्तियों को पकड़े हुए है, उनमें से कुछ नेक्स्ट हैं।
प्रश्नों को बाहर ले जाना और दो लेनदेन के साथ मैन्युअल रूप से अनुकरण करना, व्यवहार फिर से उत्पादक है। यदि XLOCK को चयन से हटा दिया जाता है तो व्यवहार बदल जाता है।
गतिरोध ग्राफ:
<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>
जहां तक मैं यह समझता हूं, मैं एक KEYLOCK गतिरोध को देख रहा हूं जो मूल रूप से एक खुला सूचकांक सूचकांक के कारण होता है जो आवश्यक मानों को इकट्ठा करने के लिए एक गैर-संकुलित और संकुल सूचकांक का उपयोग करता है, है ना?
मेरे सवाल:
- आवश्यक NTEXT कॉलम शामिल होने के कारण मैं एक कवरिंग इंडेक्स नहीं बना सकता। क्या यहां पंक्तियों की संख्या में भारी कमी करने से मदद मिलेगी?
- क्या कोई अच्छा कारण है जो मुझे नहीं पता कि SELECT को XLOCK के साथ निष्पादित किया गया है? क्या एक्सलेक के बिना भी गतिरोध होगा?