আমি কিছু পুনরায় সংঘটিত ডেডলকগুলির মুখোমুখি হচ্ছি যার মধ্যে একটি কীলক এবং এতে এক্সলক ইঙ্গিত সহ একটি নির্বাচন প্রশ্ন রয়েছে যা অচলাবস্থার শিকার হয়ে যায়। অন্য বিবৃতিটি প্রথম সন্ধানের দর্শনের অংশ এমন একটি সারণীর মধ্যে একটি INSERT।
দেখুন:
create view dbo.viewE
as
select * from dbo.E
where myValue > 13000
প্রশ্ন নির্বাচন করুন:
select * from dbo.viewE with (XLOCK) where A > GETUTCDATE()
সংস্থান বিবৃতি:
INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate())
অন্তর্নিহিত টেবিল dbo.E প্রায় 20 টি কলামে প্রায় 3 মিলিয়ন সারি ধারণ করে, এর মধ্যে কয়েকটি নেক্সট।
প্রশ্নগুলি বাইরে নিয়ে যাওয়া এবং দুটি লেনদেনের সাথে এটি ম্যানুয়ালি অনুকরণ করে, আচরণটি পুনরায় উত্পাদনযোগ্য। এক্সলোককে নির্বাচন থেকে সরানো থাকলে আচরণটি পরিবর্তিত হয়।
ডেডলক গ্রাফ:
<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>
আমি যতদূর বুঝতে পেরেছি, আমি মূলত একটি অনাবৃত সূচক ক্যোয়ারির কারণে একটি কেইলক ডেডলকটি দেখছি যা প্রয়োজনীয় মানগুলি সংগ্রহের জন্য একটি নন ক্ল্লাস্টারড এবং ক্লাস্টারড সূচক ব্যবহার করে, তাই না?
আমার প্রশ্নগুলো:
- জড়িত প্রয়োজনীয় NTEXT কলামের কারণে আমি একটি প্রচ্ছদ সূচক তৈরি করতে পারি না। এখানে কীভাবে সারির সংখ্যা হ্রাস করতে সহায়তা করবে?
- এক্সক্লক দিয়ে সিলেক্টটি কার্যকর করা হয়েছে তা আমি জানি না এমন কোনও কারণ আছে? এক্সলক ছাড়া অচলাবস্থা কি ঘটবে?