मैं एक रिपोर्टिंग मॉड्यूल के हिस्से के रूप में कई लंबे समय से चल रहे SQL क्वेरी निष्पादित कर रहा हूं। इन प्रश्नों को रन-टाइम पर गतिशील रूप से बनाया गया है। उपयोगकर्ता के इनपुट के आधार पर, वे एकल या बहु-कथन हो सकते हैं, एक या अधिक पैरामीटर हो सकते हैं और एक या अधिक डेटाबेस तालिकाओं पर काम कर सकते हैं - दूसरे शब्दों में, उनके रूप को आसानी से अनुमानित नहीं किया जा सकता है।लंबा पढ़ने के लिए SqlTransaction और IsolationLevel का उपयोग करें?
वर्तमान में, मैं तो बस इन बयानों एक साधारण SqlConnection
पर
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
को क्रियान्वित कर रहा हूँ, यानी क्योंकि इन प्रश्नों (वास्तव में बैचों क्वेरी) निष्पादित करने के लिए कुछ समय लग सकता है, मैं चिंतित ताले के बारे में टेबल पर पकड़े पढ़ता हूँ/अन्य उपयोगकर्ताओं के लिए लिखता है। बैच के निष्पादन के दौरान इन रिपोर्टों के डेटा में परिवर्तन होने पर यह कोई समस्या नहीं है; रिपोर्ट प्रश्नों को उन तालिकाओं पर अन्य परिचालनों पर कभी प्राथमिकता नहीं लेनी चाहिए, न ही उन्हें उन्हें बंद करना चाहिए।
सबसे लंबे समय से चल रहा है/बहु बयान कार्य है कि डेटा को संशोधित करने को शामिल के लिए, मैं लेनदेन का प्रयोग करेंगे। यहां अंतर यह है कि ये रिपोर्ट प्रश्न किसी भी डेटा को संशोधित नहीं कर रहे हैं। क्या मैं अपने अलगाव स्तर को नियंत्रित करने के लिए SqlTransaction
में इन रिपोर्ट क्वेरी को लपेटने में सही होगा?
यानी:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
यह मेरा वांछित परिणाम प्राप्त होगा? क्या कोई लेनदेन करने में सही है, भले ही कोई डेटा संशोधित नहीं किया गया हो? क्या कोई और दृष्टिकोण है? लेन-देन में खिलवाड़ के बिना
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
जो एक ही मंशा को प्राप्त होता है,:
रिपोर्ट रहना होगा [सही] (क्या मदद करता है http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might- be-miss-if-nolock-hint-is-used.aspx) या नहीं? –
@RemusRusanu रिपोर्ट लंबे समय तक डेटा का तात्कालिक स्नैपशॉट प्रदान करती है; उन्हें खाता परिवर्तनों को ध्यान में रखने की आवश्यकता नहीं है जो मध्य लेनदेन हो सकते हैं। कम उत्तराधिकार में उपयोगकर्ता द्वारा अंतर्निहित प्रश्नों को कई बार चलाने की संभावना है, और उपयोगकर्ता प्रत्येक बार परिणाम समान होने की अपेक्षा नहीं करेगा। –
यह वास्तव में ऐसी रिपोर्ट है जो गंदे पढ़ने से प्रभावित (बुरी तरह) हो जाती है। गणना और समेकन यादृच्छिक रूप से ऊपर और नीचे कूदेंगे और एक ही रन के भीतर डेटा (एक रिपोर्ट) संगत नहीं होगा (उदाहरण के लिए योग डेबिट! = योग क्रेडिट)। आपके उपयोगकर्ता रिपोर्ट में विश्वास खो देंगे क्योंकि यह यादृच्छिक डेटा उत्पन्न करेगा। क्या आपने ['SNAPSHOT'] (http://msdn.microsoft.com/en-us/library/ms345124 (v = sql.90) .aspx) को इसके बजाय माना है? –