2014-08-27 2 views
5

क्या लूप लॉक हो सकता है?क्या लूप लॉक हो सकता है?

पिछली रात टेस्ट टीम ने एक अजीब चुराया। एप्लिकेशन एक ग्रिड जहां उपयोगकर्ता घटनाओं की जांच कर सकते परीक्षक दो घटनाओं (आईडी: 1 और 5) का चयन किया स्थगित करना है, स्थगित कर दिया दोनों एक लेकिन मिला नहीं है स्थिति अद्यतन

मैं जानता हूँ कि [हादसा] तालिका अद्यतन किया जाना चाहिए और एक नया रिकार्ड [IncidentDetail] तालिका मैं दोनों और पूछे पर डाला शौकीन इस:।

Id IncidentKindCode TransportEntryId CreateDate    IncidentStatus CloseDate 
-- ---------------- ---------------- ---------------------- -------------- --------- 
1 11301   52    2014-08-26 19:23:21.47 1    NULL 
5 11301   56    2014-08-26 20:06:17.94 0    NULL 

Id IncidentId InsertDate    DetailKind Reason IncidentUser PostponeDate 
-- ----------- ---------------------- ---------- --------- ------------ ----------------------- 
9 1   2014-08-26 20:28:37.37 1   TEST TEST 8   2014-08-27 00:00:00.000 
10 5   2014-08-26 20:28:37.37 1   TEST TEST 8   2014-08-27 00:00:00.000 

परीक्षक शिकायत मान्य के बाद से दोनों [हादसा] ​​[IncidentStatus] मान शून्य इस पर होना चाहिए है बिंदु। इसमें खोदने के बाद मैंने सर्वर पर भेजे गए ऐप की सटीक क्वेरी पर कब्जा कर लिया (प्रोफाइलर के लिए धन्यवाद)।

declare @p1 int 
set @p1=2 
exec sp_prepexec @p1 output,N'@IDINCIDENT varchar(max) ,@REASON varchar(max) ,@USERCODE varchar(max) ,@POSTPONEDATE varchar(max) ',N' 
DECLARE @ARRAY VARCHAR(8000), @DELIMITADOR VARCHAR(100), @SELECTEDID VARCHAR(8000); 

SELECT @ARRAY = @IDINCIDENT 
SELECT @DELIMITADOR = '';'' 

IF LEN(@ARRAY) > 0 SET @ARRAY = @ARRAY + @DELIMITADOR 

WHILE LEN(@ARRAY) > 0 
BEGIN 

    SELECT @SELECTEDID = LTRIM(SUBSTRING(@ARRAY, 1, 
    CHARINDEX(@DELIMITADOR, @ARRAY) - 1)) 

    BEGIN 
     UPDATE [dbo].Incident SET INCIDENTSTATUS = 1 WHERE ID = @SELECTEDID 
     INSERT [dbo].IncidentDetail (INCIDENTID, DETAILKIND, REASON, INCIDENTUSER, POSTPONEDATE) 
         VALUES (@SELECTEDID, 1, @REASON, @USERCODE, @POSTPONEDATE); 
    END 

    SELECT @ARRAY = SUBSTRING(@ARRAY, 
    CHARINDEX(@DELIMITADOR, @ARRAY) + 1, LEN(@ARRAY)) 
END 
',@IDINCIDENT='1;5',@REASON='querty',@USERCODE='1',@POSTPONEDATE='2014-08-28 00:00:00' 
select @p1 

कोई ट्रिगर्स नहीं, कोई अन्य अपडेट लंबित लेनदेन नहीं है। जहाँ तक मुझे पता है, भले ही पहले लूप पुनरावृत्ति ने बिंदु को दूसरे बिंदु पर अवरुद्ध कर दिया हो, तो अद्यतन अपवाद होना चाहिए और सभी लेनदेन वापस लुढ़क जाएंगे।

असंगत लगता है कि सम्मिलित काम करते समय अपडेट विफल हो सकता है। सभी स्तंभों को स्टैंडएट प्रकार (Int, Varchar (100), डेटटाइम, आदि) मिला है, मैंने भी अंतर्निहित मुद्दों के लिए परीक्षण किया है।

यह समस्या केवल एक बार हुई और बैकअप का उपयोग करके भी पुन: उत्पन्न नहीं किया जा सकता है, लेकिन मुझे डर है कि यह उत्पादन में फिर से हो सकता है अगर मुझे नहीं पता कि ऐसा क्यों हुआ।

+0

SQL सर्वर में त्रुटियां कभी-कभी बैच को रोक देती हैं, कभी-कभी वे नहीं करते हैं। लेनदेन और कनेक्शन के लिए ही। (हाँ, यह बुरा है।); तो आपका अपडेट असफल हो सकता है और सम्मिलन हो सकता है। शायद आपका ऐप त्रुटियों को फेंक रहा है। – usr

+0

और नहीं, कोई लेनदेन स्वयं को ब्लॉक या डेडलॉक नहीं कर सकता है। – usr

+0

इंट्रा-क्वेरी डेडलॉक्स कर सकते हैं और हो सकते हैं। मैंने उन्हें उत्पादन कोड में खुद का सामना किया है: http://blogs.msdn.com/b/bartd/archive/2008/09/24/today-s-annoyingly-unwieldy-term-intra-query-parallel-thread -deadlocks.aspx – Jace

उत्तर

3

मुझे समझ में नहीं आया कि आप वास्तव में क्या करना चाहते हैं। मैं आपको समझने के आधार पर एक रास्ता दे रहा हूं। आप जांच सकते हैं कि क्या प्रविष्टि अपडेट हो जाती है या नहीं, अगर अपडेट किया गया है तो आप IncidentDetail में डालेंगे।

UPDATE [dbo].Incident SET INCIDENTSTATUS = 1 WHERE ID = @SELECTEDID 

If Exists( Select 1 
      From [dbo].Incident As I 
      Where I.ID = @SELECTEDID 
        And I.INCIDENTSTATUS = 1 
     ) 
Begin 
    INSERT [dbo].IncidentDetail (INCIDENTID, DETAILKIND, REASON, INCIDENTUSER, POSTPONEDATE) 
         VALUES (@SELECTEDID, 1, @REASON, @USERCODE, @POSTPONEDATE); 
End 
+0

कुछ दिनों के बाद हमने पाया कि इस मुद्दे के कारण एक और सहकर्मी ने एक पंक्ति हटा दी और हम अंधे मानते थे कि पहले समस्या नहीं थी। इसके अलावा मुझे कई संदर्भ मिलते हुए कहा गया कि एक लूप खुद को बंद नहीं कर सकता है (सवाल शुरू से मूर्खतापूर्ण था और मैं इसे बंद कर देता हूं)। मैं इसे संदर्भित करने के लिए इसे हटा नहीं देता क्योंकि कई लोग इसका दौरा करते थे। इसके अलावा आपके उत्तर को खराब कर दें क्योंकि यह किसी के लिए उपयोगी हो सकता है – jean

संबंधित मुद्दे