क्यों हैं, मुझे अपने बड़े वेब एप्लिकेशन में बहुत सारे डेडलॉक्स मिल रहे हैं।मेरे पास डेडलॉक्स के बारे में डेटा है, लेकिन मुझे समझ में नहीं आता कि वे
How to automatically re-run deadlocked transaction? (ASP.NET MVC/SQL Server)
यहाँ मैं दोबारा चला गतिरोध लेनदेन करना चाहता था, लेकिन मैं गतिरोध से छुटकारा पाने के लिए कहा गया था - यह बहुत बेहतर है, गतिरोध पकड़ने की कोशिश कर की तुलना में।
इसलिए मैंने पूरे दिन एसक्यूएल प्रोफाइलर के साथ बिताया, ट्रेसिंग कुंजी आदि सेट किया और यह मुझे मिला।
Users
तालिका है। मैं निम्न क्वेरी के साथ एक बहुत ही उच्च प्रयोग करने योग्य पृष्ठ है (यह केवल क्वेरी नहीं है, लेकिन यह एक है कि मुसीबतों का कारण बनता है है)
UPDATE Users
SET views = views + 1
WHERE ID IN (SELECT AuthorID FROM Articles WHERE ArticleID = @ArticleID)
और फिर वहाँ में निम्न क्वेरी सभी पृष्ठों है:
User = DB.Users.SingleOrDefault(u => u.Password == password && u.Name == username);
वहीं मैं कुकीज़ से उपयोगकर्ता प्राप्त करता हूं।
अक्सर एक डेडलॉक होता है और यह दूसरी लिंक-टू-एसक्यूएल क्वेरी पीड़ित के रूप में चुनी जाती है, इसलिए यह नहीं चलती है, और मेरी साइट के उपयोगकर्ता एक त्रुटि स्क्रीन देखते हैं।
यह .XDL ग्राफ एसक्यूएल प्रोफाइलर द्वारा कब्जा कर लिया से जानकारी है (यह है सिर्फ पहली गतिरोध, यह न केवल एक है पूरी सूची विशाल है।।):
<deadlock-list>
<deadlock victim="process824df048">
<process-list>
<process id="process824df048" taskpriority="0" logused="0" waitresource="PAGE: 7:1:13921" waittime="1830" ownerId="91418" transactionname="SELECT" lasttranstarted="2010-05-31T12:17:37.663" XDES="0x868175e0" lockMode="S" schedulerid="2" kpid="5076" status="suspended" spid="72" sbid="0" ecid="2" priority="0" trancount="0" lastbatchstarted="2010-05-31T12:17:37.663" lastbatchcompleted="2010-05-31T12:17:37.663" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" isolationlevel="read committed (2)" xactid="91418" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="74" sqlhandle="0x02000000de1cb30b5b2e40e31ffb345af3c7529430b559c2">
*password------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
</inputbuf>
</process>
<process id="process8765fb88" taskpriority="0" logused="216" waitresource="PAGE: 7:1:14196" waittime="1822" ownerId="91408" transactionname="UPDATE" lasttranstarted="2010-05-31T12:17:37.640" XDES="0x86978e90" lockMode="IX" schedulerid="2" kpid="5216" status="suspended" spid="73" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2010-05-31T12:17:37.557" lastbatchcompleted="2010-05-31T12:17:37.557" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" loginname="sdfkj93jks9sl" isolationlevel="read committed (2)" xactid="91408" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="database.dbo.UpdateUserStats" line="31" stmtstart="1794" stmtend="2088" sqlhandle="0x03000700bac8836333e58f00879d00000100000000000000">
UPDATE Users
SET Views = Views + 1
WHERE ID IN (SELECT AuthorID FROM Articles WHERE ArticleID = @ArticleID) </frame>
<frame procname="adhoc" line="1" stmtstart="84" sqlhandle="0x01000700b7c78e0760dd3f81000000000000000000000000">
EXEC @RETURN_VALUE = [dbo].[UpdateUserStats] @UserID = @p0 </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@p0 int,@RETURN_VALUE int output)EXEC @RETURN_VALUE = [dbo].[UpdateUserStats] @UserID = @p0 </inputbuf>
</process>
<process id="process86ce0988" taskpriority="0" logused="10000" waittime="1806" schedulerid="1" kpid="2604" status="suspended" spid="72" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2010-05-31T12:17:37.663" lastbatchcompleted="2010-05-31T12:17:37.663" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" loginname="sdfkj93jks9sl" isolationlevel="read committed (2)" xactid="91418" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="74" sqlhandle="0x02000000de1cb30b5b2e40e31ffb345af3c7529430b559c2">
*password------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
*password-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- </inputbuf>
</process>
</process-list>
<resource-list>
<pagelock fileid="1" pageid="13921" dbid="7" objectname="database.dbo.Users" id="lock85535c80" mode="IX" associatedObjectId="72057594046382080">
<owner-list>
<owner id="process8765fb88" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process824df048" mode="S" requestType="wait"/>
</waiter-list>
</pagelock>
<pagelock fileid="1" pageid="14196" dbid="7" objectname="database.dbo.Users" id="lock8469f980" mode="SIU" associatedObjectId="72057594046382080">
<owner-list>
<owner id="process86ce0988" mode="S"/>
</owner-list>
<waiter-list>
<waiter id="process8765fb88" mode="IX" requestType="convert"/>
</waiter-list>
</pagelock>
<exchangeEvent id="Pipe894b0680" WaitType="e_waitPipeGetRow" nodeId="0">
<owner-list>
<owner id="process824df048"/>
</owner-list>
<waiter-list>
<waiter id="process86ce0988"/>
</waiter-list>
</exchangeEvent>
</resource-list>
</deadlock>
मैं गतिरोध के बारे में बहुत पढ़ा ... और मुझे समझ में नहीं आता कि यह एक डेडलॉक क्यों कर रहा है।
तो जाहिर है कि ये दोनों प्रश्न अक्सर चलते हैं। कम से कम एक बार एक बार। शायद और भी अक्सर (300-400 उपयोगकर्ता ऑनलाइन)। तो वे एक ही समय में बहुत आसानी से चल सकते हैं, लेकिन यह एक डेडलॉक क्यों करता है? कृपया मदद करे।
धन्यवाद
क्या आप SQL2005 या बाद में हैं? यदि आपको एसक्यूएल प्रोफाइलर से डेडलॉक ग्राफ मिल गया है? क्या आपको पता है कि लेनदेन अलगाव स्तर आपके प्रश्नों के तहत क्या चल रहा है? –
हां मुझे ग्राफ मिला। यही वह जगह है जहां से मुझे यह जानकारी मिली। मैं लेनदेन अलगाव के बारे में कुछ भी नहीं जानता।मैं इसे कहां देख सकता हूं? – Alex
प्रोफाइलर ट्रेस में सीधे डेडलॉक ग्राफ़ ईवेंट पर क्लिक करें और ईवेंट डेटा निकालें चुनें, इसे xml के रूप में सहेजें। फिर इसे नोटपैड में खोलें और "अलगावलेवल" ढूंढें –