क्या लूप लॉक हो सकता है?क्या लूप लॉक हो सकता है?
पिछली रात टेस्ट टीम ने एक अजीब चुराया। एप्लिकेशन एक ग्रिड जहां उपयोगकर्ता घटनाओं की जांच कर सकते परीक्षक दो घटनाओं (आईडी: 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), डेटटाइम, आदि) मिला है, मैंने भी अंतर्निहित मुद्दों के लिए परीक्षण किया है।
यह समस्या केवल एक बार हुई और बैकअप का उपयोग करके भी पुन: उत्पन्न नहीं किया जा सकता है, लेकिन मुझे डर है कि यह उत्पादन में फिर से हो सकता है अगर मुझे नहीं पता कि ऐसा क्यों हुआ।
SQL सर्वर में त्रुटियां कभी-कभी बैच को रोक देती हैं, कभी-कभी वे नहीं करते हैं। लेनदेन और कनेक्शन के लिए ही। (हाँ, यह बुरा है।); तो आपका अपडेट असफल हो सकता है और सम्मिलन हो सकता है। शायद आपका ऐप त्रुटियों को फेंक रहा है। – usr
और नहीं, कोई लेनदेन स्वयं को ब्लॉक या डेडलॉक नहीं कर सकता है। – usr
इंट्रा-क्वेरी डेडलॉक्स कर सकते हैं और हो सकते हैं। मैंने उन्हें उत्पादन कोड में खुद का सामना किया है: http://blogs.msdn.com/b/bartd/archive/2008/09/24/today-s-annoyingly-unwieldy-term-intra-query-parallel-thread -deadlocks.aspx – Jace