मैं sp_getapplock
और सत्र स्वामी प्रकार के साथ ईएफ संदर्भ का उपयोग करने के जोखिम/सुरक्षा के बारे में सोच रहा हूं। docs के आधार पर, मेरी समझ यह है कि एक सत्र स्वामी का मतलब है कि सत्र समाप्त होने पर लॉक जारी किया जाएगा यदि इससे पहले स्पष्ट रूप से रिलीज़ नहीं होता है। मुझे लगता है कि यह भी मतलब है कि कनेक्शन समाप्त होता है।क्या EF6 DbContexts के साथ सत्र-स्वामित्व वाले SQL सर्वर sp_getapplock का उपयोग करना सुरक्षित है?
मेरे पास यह सब लेनदेन-स्वामित्व वाले ताले के साथ पहले से ही काम कर रहा है, लेकिन इससे अन्य मुद्दों और जटिलताओं को सामने लाया जाता है, इसलिए मैं सत्र-स्वामित्व वाले ताले के साथ ऐसा करने के बारे में सोच रहा हूं और व्यवहार के साथ कैसे टकराएगा या नहीं DbContext
और इसके कनेक्शन हैंडलिंग।
मैं 100% सुनिश्चित नहीं हूं कि DbContext
डिफ़ॉल्ट रूप से काम करता है, चाहे वह पूल का उपयोग करता हो या प्रत्येक संदर्भ उदाहरण खुलता है और अपने कनेक्शन बंद कर देता है (जो दस्तावेज़ मैंने पढ़ा है, वे बाद वाले सुझाव देते हैं)। इस सवाल के लिए मान लीजिए कि मैं कनेक्शन प्रबंधन (मैं शायद ही कभी करता हूं) के साथ कुछ भी नहीं कर रहा हूं, इसलिए ईएफ इसे संभालने में कामयाब रहा है, या जो कुछ भी इसे संभालता है उसे संभाला जा रहा है।
अगर मैं एक DbContext
इंस्टेंस बनाएं कनेक्शन हड़पने, एक सत्र के स्वामित्व वाली ताला, संदर्भ के रूप में सामान्य, नहीं रिलीज ताला करते हैं और संदर्भ के निपटान बनाने के उपयोग करने के लिए एसक्यूएल निष्पादित, इस काम करेगा सही ढंग से? (वास्तविकता में, यह एक IDisposable
आवरण है कि को रोकने के लिए होगा, लेकिन सवाल बनी हुई है।)
खराब उदाहरण देकर स्पष्ट करने के लिए:
using (var ctx = new MyContext()) {
var conn = ctx.Database.Connection.Open();
conn.ExecuteSqlSomehow("sp_getapplock blahblah");
try {
// Lots of queries, savechanges, etc.
} finally {
// Oops I forgot to conn.ExecuteSql("sp_release the lock");
}
}
await WatchMovieAsync();
using (var ctx = new MyContext()) {
// Can this reuse the same connection, session and/or lock?
}
सवाल:
- एक और संदर्भ किसी भी तरह फिर से किया जा सका उदाहरण के निपटारे के बाद मेरे कनेक्शन और उसके सत्र लॉक का उपयोग करें?
- उस मामले के लिए, क्या कोई अन्य संदर्भ (उदाहरण के लिए किसी अन्य थ्रेड में) एक कनेक्शन का उपयोग कर सकता है जिस पर मैंने लॉक जारी किया था जबकि मूल धागा अभी भी
using
ब्लॉक में है? - क्या ईएफ लॉक कनेक्शन बंद कर सकता है और बाद में उसी
using
ब्लॉक (उदा।SaveChanges
के लिए) खोल सकता है, जिससे लॉक जारी किया जा सकता है?
'sp_reset_connection' वास्तव में Linq2Sql के साथ हर बार कहा जाता है। लेकिन अगर सक्रिय 'ट्रांज़ेक्शनस्कोप' है तो यह * नहीं होता है। – GSerg