सरल तरीका है, प्रति अनुरोध एक डीबीकॉन्टेक्स्ट करने के लिए, एएसपी.नेट एमवीसी सभी थ्रेड सुरक्षा करता है, प्रत्येक अनुरोध के लिए एएसपी.नेट एमवीसी में प्रत्येक नियंत्रक उदाहरण अलग होता है, आप नहीं करते दौड़ की स्थिति के बारे में चिंता करने के लिए है। जब तक आप धागे नहीं बनाते हैं और केवल डीबीकॉन्टेक्स्ट का उपयोग करके एक्शन विधि में डेटा रूपांतरण करते हैं, तो आपको कोई समस्या नहीं होगी।
मूल रूप से डीबीकॉन्टेक्स्ट कुछ भी नहीं करता है, यह सिर्फ डेटाबेस को लक्षित करने के लिए SQL क्वेरी कतार देता है, यह डेटाबेस है जो बहु थ्रेडिंग, दौड़ की स्थिति को संभालता है। अपने डेटा की रक्षा के लिए, आपको लेन-देन का उपयोग करें और अपने डेटाबेस में सत्यापन जोड़ना चाहिए यकीन है कि वे सही ढंग से सहेजे जाते हैं
public abstract class DbContextController : Controller{
public AppDbContext DB { get; private set;}
public DbContextController(){
DB = new AppDbContext();
}
protected override void OnDisposing(bool disposing){
DB.Dispose();
}
}
आप DbContextController
से किसी भी वर्ग के वारिस और नियंत्रक के जीवन भर डीबी का उपयोग करते हैं बनाने के लिए, आप की जरूरत नहीं होगी कोई परेशानी।
public ActionResult ProcessProducts(){
foreach(var p in DB.Products){
p.Processed = true;
foreach(var order in p.Orders){
order.Processed = true;
}
}
DB.SaveChanges();
}
लेकिन, आप निम्न उदाहरण में जैसे किसी भी धागे का उपयोग करते हैं,
public ActionResult ProcessProducts(){
Parallel.ForEach(DB.Products, p=>{
p.Processed = true;
// this fails, as p.Orders query is fired
// from same DbContext in multiple threads
foreach(var order in p.Orders){
order.Processed = true;
}
});
DB.SaveChanges();
}
स्रोत
2015-09-05 11:22:19
यदि आप इसे एक ही लेनदेन में करना चाहते हैं तो एक एकल डीबीकॉन्टेक्स्ट ठीक है। थ्रेड सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है, हालांकि आपको अपने सभी परिचालनों को अनुक्रमिक रूप से करने की आवश्यकता होगी। – DavidG
@ डेविड जी: लेकिन क्या होगा यदि 2 उपयोगकर्ता एक ही समय में एक ही डीबीकॉन्टेक्स्ट का उपयोग करने का प्रयास करते हैं? क्या यह रेस की स्थिति नहीं पैदा करेगा? – Idov
आपको ऐसा होने की अनुमति कभी नहीं देना चाहिए। डीबीकॉन्टेक्स्ट का उपयोग इस तरह से नहीं किया जाना चाहिए और यदि आप कोशिश करते हैं तो कुछ बहुत ही अजीब चीजें करेंगे! – DavidG