मेरे पास दो लेनदेन के साथ एक डेडलॉक समस्या है जो किसी भी सामान्य रिकॉर्ड तक नहीं पहुंचती है। कोई ताला वृद्धि भी नहीं है। इसलिए मैं समझा नहीं सकता कि डेडलॉक क्यों संभव है।एसक्यूएल सर्वर 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 सर्वर समस्या हो सकती है?
बहुत बहुत धन्यवाद।
"/ * लेनदेन सिंक्रनाइज़ करते हैं * /" मतलब क्या है? –
@ मिच: इसका मतलब है कि मैं इस बिंदु तक लेनदेन 1 चलाता हूं, फिर लेनदेन 2 चलाता हूं, जो चयन पर इंतजार करता है, फिर मैं अंत में लेनदेन 1 चलाता हूं, जो चयन पर भी इंतजार करता है। –