2009-09-17 14 views
5

मेरे पास दो लेनदेन के साथ एक डेडलॉक समस्या है जो किसी भी सामान्य रिकॉर्ड तक नहीं पहुंचती है। कोई ताला वृद्धि भी नहीं है। इसलिए मैं समझा नहीं सकता कि डेडलॉक क्यों संभव है।एसक्यूएल सर्वर 2005: कोई साझा रिकॉर्ड के साथ डेडलॉक समस्या

गतिरोध तब होता है जब इस तरह के दो लेन-देन एक ही समय में क्रियान्वित कर रहे हैं:

CREATE TABLE A (
    id INT NOT NULL, 
    [value] INT, 
    B_FK INT 
    primary key (id) 
) 

CREATE TABLE B (
    id INT NOT NULL, 
    primary key (id) 
) 

CREATE TABLE C (
    id INT NOT NULL, 
    A_FK INT 
    primary key (id) 
) 

INSERT INTO A VALUES(1, 1, 1) 
INSERT INTO B VALUES(1) 
INSERT INTO C VALUES(1, 1) 

INSERT INTO A VALUES(2, 2, 2) 
INSERT INTO B VALUES(2) 
INSERT INTO C VALUES(2, 2) 

टेबल A के बीच में है:

begin transaction 

update A set [value] = [value] 
where id = 1; /* resp. 2 */ 

/* synchronize transactions here */ 

SELECT * 
FROM 
A inner join B on A.B_FK = B.id 
inner join C on C.A_FK = A.id 
WHERE 
A.[value] = 1; /* resp. 2 */ 

rollback; 

इन तालिकाओं और सेटअप करने के लिए डेटा परिदृश्य हैं तीन टेबल अगर मैं क्वेरी में कुछ भी बदलता हूं, उदाहरण के लिए B या C में शामिल तालिकाओं में से एक को हटा दें, तो कोई डेडलॉक नहीं है। वही जब मैं A.value के बजाय A.id द्वारा फ़िल्टर करता हूं।

डेडलॉक-ग्राफ मुझे बताता है कि वे दोनों तालिका A की प्राथमिक कुंजी अनुक्रमणिका में एक एस लॉक सेट करना चाहते हैं। दोबारा: कोई लॉक वृद्धि नहीं है।

मैं SqlServer उपयोग कर रहा हूँ 2005.

  • क्यों इन लेनदेन किसी भी आम डेटा तक पहुँचने के बिना परस्पर विरोधी हैं? क्या कोई इसे समझा सकता है?
  • इससे बचने के लिए मैं क्या कर सकता हूं? मैं NHibernate का उपयोग कर रहा हूं और आसानी से क्वेरी को नहीं बदल सकता।
  • क्या यह एक SQL सर्वर समस्या हो सकती है?

बहुत बहुत धन्यवाद।

+0

"/ * लेनदेन सिंक्रनाइज़ करते हैं * /" मतलब क्या है? –

+0

@ मिच: इसका मतलब है कि मैं इस बिंदु तक लेनदेन 1 चलाता हूं, फिर लेनदेन 2 चलाता हूं, जो चयन पर इंतजार करता है, फिर मैं अंत में लेनदेन 1 चलाता हूं, जो चयन पर भी इंतजार करता है। –

उत्तर

7

संघर्ष हो सकता है, क्योंकि SQL-Server न केवल पंक्ति स्तर पर लॉक करता है, बल्कि पृष्ठ या यहां तक ​​कि तालिका स्तर पर भी लॉक करता है।

इसका मतलब है कि एक रिकॉर्ड को लॉक किया जा सकता है भले ही यह वास्तव में उपयोग में नहीं है, लेकिन केवल "पास" के एक अलग रिकॉर्ड है।

SQL Server Lock Contention Tamed

+0

हां - यदि यह पंक्ति-स्तर लॉकिंग प्राप्त नहीं कर सकता है, तो यह पृष्ठ और फिर तालिका में बढ़ जाता है। –

+0

लेकिन क्या यह एक लॉक वृद्धि नहीं है? क्या यह प्रोफाइलर में नहीं पता होना चाहिए? –

+0

मेरी समझ से एसक्यूएल सर्वर शुरुआत से पेज लॉकिंग का उपयोग करने का निर्णय ले सकता है। उस स्थिति में कोई वृद्धि नहीं होगी। – Wolfgang

1

इसके अलावा, एक और बात पर विचार करना है जब आप कभी कभी इन समस्याओं को पाने के लिए उपयोगी हो सकता है कि ताला चलाता द्वारा किया प्रसंस्करण से आ सकता है है।

+0

सौभाग्य से, मेरे पास डीबी में कोई ट्रिगर नहीं है। फिर भी धन्यवाद। –

+0

क्या आप कृपया विस्तार से बता सकते हैं कि क्यों ट्रिगर्स कोई फर्क पड़ता है? –

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