मैं दो डेटा सेट सम्मिलित कर रहा था, न्यूनतम लॉगिंग का उपयोग करके, एक खाली हीप तालिका में दो समानांतर SQL टास्क के माध्यम से समानांतर में चल रहा है और निम्न फॉर्म के एसक्यूएल के साथ।
INSERT INTO Table (TABLOCK) SELECT FROM ...
जॉब थोड़ा रुकने के बाद, SQL कार्य में से एक एक डेडलॉक शिकार बन गया। नीचे डेडलॉक ग्राफ का XML आउटपुट है।
क्या कोई समझा सकता है कि हुड के नीचे क्या हो रहा था?
<resource-list>
<objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
<owner-list>
<owner id="process9609dc8" mode="Sch-S"/>
<owner id="process9609dc8" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process5e13048" mode="X" requestType="convert"/>
</waiter-list>
</objectlock>
<objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
<owner-list>
<owner id="process5e13048" mode="Sch-S"/>
<owner id="process5e13048" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process9609dc8" mode="X" requestType="convert"/>
</waiter-list>
</objectlock>
</resource-list>
चीजें बहुत पेचीदा हो जाती हैं क्योंकि मैंने पाया है कि ज्यादातर मामलों में दो एक्सक्यूटाइल एसक्यूएल टास्क समानांतर रूप से सफलतापूर्वक चल सकते हैं। नीचे आज़माएँ:
Create table dbo.TablockInsert (c1 int, c2 int, c3 int)
--then issue the script in two Execute Sql Task in parallel you won't fail:
insert into dbo.TablockInsert(TABLOCK) SELECT 1, 1, 1
चूंकि एकमात्र अंतर SELECT ... FROM ... स्टेटमेंट, SELECT ... FROM ... स्टेटमेंट की तरह दिखता है, जिससे यहां लॉक इन पर प्रभाव पड़ सकता है?