यह प्रश्न माइक्रोसॉफ्ट एंटिटी फ्रेमवर्क का उपयोग करके कई आवेषण या अपडेट को संभालने के लिए सर्वोत्तम अभ्यास के संबंध में है। समस्या यह है कि हमने एक लंबे समय से चलने वाला कार्यक्रम लिखा है जो डेटाबेस से हजारों रिकॉर्ड वापस खींचता है, और उसके बाद उन प्रत्येक रिकॉर्ड पर एक-एक फ़ील्ड अपडेट करता है, एक-एक-एक। हमारी निराशा के लिए, हमने महसूस किया कि अद्यतन किए गए प्रत्येक रिकॉर्ड को उस समय की अवधि के लिए बंद कर दिया गया था जिसमें ऑब्जेक्ट कॉन्टेक्स्ट का निपटारा नहीं किया गया था। नीचे कुछ स्यूडोकोड (वास्तव में नहीं चलता है) वर्णन करने के लिए है:एंटीटी फ्रेमवर्क में डेटाबेस लॉक करने से कैसे बचें 4 कई अपडेट करते समय
using(ObjectContext context = new ObjectContext())
{
var myRecords = context.CreateObjectSet<MyType>().AsQueryable();
foreach(var record in myRecords)
{
record.MyField = "updated!";
context.SaveChanges();
//--do something really slow like call an external web service
}
}
समस्या यह है कि हम लेनदेन के लिए किसी भी संबंध के बिना कई अपडेट करने की ज़रूरत है। हम यह जानकर आश्चर्यचकित हुए कि संदर्भ को संदर्भित करना। सेव चेंज() वास्तव में रिकॉर्ड पर लॉक बनाता है और ऑब्जेक्ट कॉन्टेक्स्ट का निपटारा होने तक इसे रिलीज़ नहीं करता है। हम विशेष रूप से डेटाबेस में रिकॉर्ड्स लॉक नहीं करना चाहते हैं क्योंकि यह एक उच्च ट्रैफिक सिस्टम है और प्रोग्राम संभावित रूप से घंटों तक चल सकता है।
तो सवाल यह है कि: माइक्रोसॉफ्ट एंटीटी फ्रेमवर्क 4 में कई अपडेट करने का सबसे अच्छा तरीका क्या है जो उन्हें एक लंबे लेनदेन पर करने के लिए डीबी लॉक करता है? हम उम्मीद कर रहे हैं कि उत्तर प्रत्येक अद्यतन के लिए एक नया ऑब्जेक्ट कॉन्टेक्स्ट नहीं बनाना है ...
क्या आप रिकॉर्ड लॉक देख रहे हैं या पृष्ठों या तालिकाओं में एस्केलेशन लॉक कर रहे हैं? –
पूरी तालिका को लॉक किया गया प्रतीत होता है ताकि आप रिकॉर्ड डालें या अपडेट न कर सकें। हालांकि, आप रिकॉर्ड्स का चयन तब तक कर सकते हैं जब तक कि आप वापस रिकॉर्ड किए गए रिकॉर्ड्स में से एक का चयन न करें।हमारे छद्म उदाहरण में ऊपर हम सभी रिकॉर्ड वापस खींच लिया, हालांकि। हकीकत में, हम केवल कुल रिकॉर्ड के उप-सेट को वापस खींच रहे थे और केवल उन रिकॉर्ड को पढ़ने से बंद कर दिया गया था। हालांकि, पूरी तालिका लिखने से बंद है। – jakejgordon