Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

बिना पढ़े पढ़ने के साथ ट्रांजेक्शनस्कोप का उपयोग - एसक्यूएल में (नोलॉक) के साथ आवश्यक है?

संक्षिप्त उत्तर:नहीं

लंबा उत्तर:

केवल TransactionScope को परिभाषित करने से यह परिभाषित नहीं होता है कि लेन-देन के भीतर किसी भी पढ़ने या लिखने को लागू किया जाएगा।

लेन-देन के भीतर कुछ चलाने के लिए, आपको अभी भी एक लेनदेन खोलना और करना होगा!

TransactionOptions Timeout . के लिए TransactionScope का और IsolationLevel बस डिफ़ॉल्ट को परिभाषित करें उन विकल्पों के बिना स्पष्ट रूप से सेट किए गए दायरे के भीतर बनाए गए किसी भी लेनदेन के लिए। वास्तव में TransactionScope एक Transaction बनाता है लेकिन यह एक नया Transaction खोले बिना सक्रिय नहीं होगा। आंतरिक रूप से यह कुछ जटिल चीजें करेगा, लेन-देन की क्लोनिंग आदि... तो चलिए इसे अनदेखा करते हैं...

लेन-देन के बिना आप अलगाव स्तर को परिभाषित नहीं कर सकते हैं, कोई भी चयन कथन IsolationLevel.ReadCommitted के साथ चलाया जाएगा क्योंकि यह SQL सर्वर का डिफ़ॉल्ट है।

आप session.Transaction.IsActive . को भी क्वेरी कर सकते हैं यह देखने के लिए कि सत्र के लिए वर्तमान में कोई लेनदेन सक्रिय है या नहीं!

आइए निम्नलिखित कोड पर एक नज़र डालें, मैंने इसे थोड़ा और स्पष्ट करने के लिए कुछ टिप्पणियां दी हैं

using (var scope = new TransactionScope(TransactionScopeOption.Required,
                    new TransactionOptions()
                    {
                        IsolationLevel = IsolationLevel.ReadUncommitted
                    }))
{

    using (var session = sessionFactory.OpenSession())
    {
        // outside any transaction...
        var x = session.Transaction.IsActive; // false;

        // read will be done with SQL Server default (ReadCommited)
        var pp = session.Query<Page>().Where(p => p.Photos.Count() > 1).ToList();

        using (var transaction = session.BeginTransaction())
        {
            // will use ReadUncommitted according to the scope
            var y = session.Transaction.IsActive; // true;

            var p1 = session.Get<Page>(1);

            transaction.Commit();
        }
        using (var transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
        {
            // will use ReadCommitted according to the transaction initialization
            var y = session.Transaction.IsActive; // true;

            var p1 = session.Get<Page>(1);

            transaction.Commit();
        }

        scope.Complete();
    }
}

आप SQL सर्वर प्रोफाइलर का उपयोग करके यह भी देख सकते हैं कि SQL सर्वर उन सेटिंग्स पर कैसे प्रतिक्रिया करता है।

बस एक नया ट्रेस बनाएं और Audit Login . के लिए देखें घटना, घटना के पाठ में अलगाव स्तर शामिल होगा और आप देख सकते हैं कि यह वास्तव में एक Audit Login करता है हर बार जब कोई लेन-देन बनाया जाता है, उदाहरण के लिए

 set transaction isolation level read uncommitted

--

कृपया मुझे सुधारें यदि इनमें से कोई भी जानकारी गलत हो सकती है, तो मैंने इसे स्वयं ही समझ लिया है, इसलिए विफलता की कुछ संभावना हो सकती है;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एंटिटी फ्रेमवर्क कोड पहले - टेबल कॉलम कोलाज बदलें

  2. SQL सर्वर में एक समग्र प्राथमिक कुंजी कैसे बनाएं (T-SQL उदाहरण)

  3. SSIS पैकेज को SQLAgent जॉब के रूप में निष्पादित करना

  4. एसक्यूएल सर्वर 2008 लॉगिन उपयोगकर्ता 'एनटी प्राधिकरण \ नेटवर्क सेवा' के लिए विफल रहा

  5. SQL सर्वर डेटाबेस में सभी जाँच बाधाओं को कैसे सक्षम करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 88