Set Transaction Isolation Level Read Uncommitted: Transaction Create करना व उसके Behavior को Control करना दो एकदम अलग बातें हैं, जिन्हे ठीक से समझे बिना एक Multiuser Concurrent Environment आधारित Database Application के लिए Transactions को Proper तरीके से उपयोग में नहीं लिया जा सकता। Transaction के Behavior को Control करने के लिए ही Isolation Level के Concept को Implement किया गया है, जिसके अन्तर्गत इस बात को Specify किया जाता है कि एक Transaction द्वारा Execute होने वाली Queries किस तरह से किसी दूसरे Transaction द्वारा Execute होने वाली Queries के Resultset को प्रभावित करती है।
Isolation Levels
Isolation Level एक Measurement का तरीका है, जो इस बात को त; करता है कि एक Transaction द्वारा किए गए Changes उस Transaction के Outside में किसी अन्य Transaction के लिए कितना Visible रहेगा।
उदाहरण के लिए Default रूप से SQL Server में यदि दो Transactions स्वतंत्र रूप से Run हो रहे हों, तो एक Transaction द्वारा Insert किया गया नया Record दूसरे Transaction के लिए तब तक Visible नहीं होता, जब तक कि पहला Transaction उस Newly Inserted Row को Commit नहीं कर देता।
Isolation Level का Concept Database के Locks Concept से Closely Related है क्योंकि किसी Transaction के लिए Isolation Levels को त; करके हम इस बात को निश्चित कर सकते हैं कि कोई Transaction कितने समय तक Resources को किसी अन्य User द्वारा Perform किए जाने वाले Changes से Protect करेगा।
हम किसी Specific जरूरत को पूरा करने के लिए किसी एक Transaction द्वारा Access किए जाने वाले Rows को अन्य Transactions द्वारा Visible होने के लिए Transaction ds Behavior को Modify कर सकते हैं। इस प्रकार से Modified Transaction के कारण जब कोई दूसरा Transaction उस पहले Transaction द्वारा Modified Data को Access करता है, तो उस दूसरे Transaction को वास्तव में Invalid Data प्राप्त होता है, क्योंकि पहले Transaction ने उस Data को अभी तक Commit नहीं किया होता है, जिसे Dirty Read के नाम से जाना जाता है।
लेकिन यदि हम Invalid Data को Read करना चाहें, तो ADO.NET हमें इस प्रकार के Invalid Data को Read करने की सुविधा Provide करता है, जहां हम Appropriate Isolation Level Specify करके, Invalid Data को Read कर सकते हैं। ADO.;NET का प्रयोग करते हुए Invalid Data को Read करने के लिए हम Isolation Level Enumerated Values को Transaction Begin करते समय Specify कर सकते हैं। लेकिन इससे पहले Database से सम्बंधित कुछ Special शब्दों का मतलब समझ लेना हमारे लिए उपयोगी रहेगा जो कि निम्नानुसार हैं:
Dirty Read
Dirty Read, एक ऐसी Condition को Represent करता है, जब कोई Transaction किसी ऐसे Data को Read कर रहा होता है, जिसे किसी अन्य Transaction द्वारा Modify तो किया गया होता है, लेकिन अभी तक Commit नहीं किया गया होता। उदाहरण के लिए यदि Transaction A किसी ऐसे Row को Read करता है, जिसे Transaction B ने Modify किया है, लेकिन अभी तक Commit नहीं किया है, तो Transaction A जिस Data को देखेगा, वह एक Invalid Data होगा, जिसे Dirty Read के नाम से जाना जाएगा।
Nonrepeatable Read
जब कोई Transaction A किसी Table से किसी Record को Read करता है, उसी समय Transaction B उसी Record को Alter या Delete करके Changes को Commit कर देता है। इस स्थिति में यदि Transaction A फिर से उसी Record को Read करने की कोशिश करे, तो या तो उसे उस Record को अलग Version प्राप्त होता है अथवा उसे वह Record प्राप्त ही नहीं होता। इस प्रकार की Condition को Nonrepeatable Read के नाम से जाना जाता है।
Phantom Read
मानलो कि कोई Transaction A Record Selection के लिए किसी Criteria को Follow करता है। उदाहरण के लिए Transaction A किसी अमुक समय पर एक बार में 50 Records को Read करता है। ठीक इसी दौरान कोई Transaction B कुछ नए Records Add करता है। इसलिए अब यदि Transaction A फिर से Selection करता है, तो उसे वही Records प्राप्त नहीं होते, जो पहले हुए थे। इस प्रकार की Situation को Phantom Read के नाम से जाना जाता है।
Isolation Levels of ADO.NET
ADO.NET हमें कई प्रकार के अलग-अलग Isolation Levels Provide करता है, जिन्हें हम IsolationLevel Enumeration के माध्यम से Access कर सकते हैं और ADO.NET द्वारा Create किए जाने वाले Transaction पर Apply कर सकते हैं। इस Enumeration में Exist विभिन्न Isolation Enumeration निम्नानुसार हैं:
Chaos
ये Setting Oracle SQL Server या Oracle द्वारा Supported नहीं है। इस Setting का प्रयोग करने पर सभी Transactions एक दूसरे से पूरी तरह से Isolated होते हैं, इसलिए किसी भी तरह से एक दूसरे के Data को Overwrite नहीं कर सकते।
ReadUncommitted
इस मान को Specify करने पर Dirty Read सम्भव होता है। यानी इसे Specify करने पर Modify होने वाली त्वू पर कोई Shared या Exclusive Lock Place नहीं होता। इस Isolation Level का प्रयोग तब किया जाता है, जब हम किसी Specific Condition से Match होने वाले सभी Data पर कोई Operation Perform करना चाहते हैं, भले ही Match होने वाला Data Committed है या नहीं, इस बात से कोई फर्क नहीं पडता।
सामान्यत: इस Isolation Level को हम तब Use करते हैं जब हमें हमारे Application में Query होने वाले Data की Accuracy की Guarantee नहीं चाहिए होती है और हमारे Application की मुख्य Priority Performance होती है।
ReadCommitted
इस Setting को Specify करने पर Transaction द्वारा Access होने वाली Row पर Shared Lock Apply होता है। जिसकी वजह से Dirty Read सम्भव नहीं होता लेकिन Transaction Complete होने से पहले Data को Change किया जा सकता है। जिसकी वजह से Nonrepeatable Read या Phantom Rows का प्रभाव प्राप्त हो सकता है। इस Isolation Level को तब Use किया जाना चाहिए, जब हमारा Data Committed हो और Certain Condition से Match करता हो।
Shared Locks
इस Setting को तब Apply किया जाता है, जब Transaction किसी Data को Database से Read करना चाहता है, जिस पर पहले से कोई Exclusive Lock Applied नहीं होता। इस Isolation Level के Applied होने की स्थिति में Data को तब तक कोई भी Transaction Access नहीं कर सकता, जब तक कि पहला Transaction अपना काम पूरा नहीं कर लेता।
Exclusive स्वबा वह Lock होता है, जो दो या अधिक Transactions को समान समय समान Row के Data को Modify करने से रोकता है। ये Lock Automatically तब Apply हो जाता है, जब किसी Transaction द्वारा Access किए जाने वाले Table/Tables पर कोई Lock Applied नहीं होता और Transaction उस Table/Tables के Data को Update करना चाहता है। चूंकि एक Exclusive Lock की जरूरत होती है, इसलिए ये Lock एक प्रकार से Pessimistic Locking को Represent करता है।
इस Isolation Level को तब Use किया जाता है, जब हमें हमारे Transaction के Execution में Consistency की जरूरत होती है, लेकिन Nonrepeatable Reads की चिन्ता करने की जरूरत नहीं होती। ये Isolation Level Oracle व SQL Server में Supported है, जबकि SQL Server के SqlTransaction Object का ये Default Isolation Level है।
RepeatableRead
इस Value को Use करने पर Query द्वारा Access होने वाले सभी Rows पर Shared Lock Place हो जाता है, जिसकी वजह से न तो अन्य Transaction द्वारा Locked Data को Modify किया जा सकता है न ही Nonrepeatable Reads सम्भव होता है। फिर भी Phantom Rows सम्भव होता है। ये Isolation Level तब Use किया जाना चाहिए, जब हम ऐसे Records को Read करना चाहते हैं, जो Future Reads के लिए भी समान Values Return करें।
इस Value को Use करने का मतलब ये है कि तब तक के लिए सभी प्रकार के Modification को रोक दिया जाए, जब तक कि Transaction पूरी तरह से Complete न हो जाए। अत: इस प्रकार के Transaction को तब Use किया जाता है, जब हमें Consistency की आव”;कता Performance की तुलना में ज्यादा होती है। हालांकि इसमें भी Phantom Reads सम्भव है और ये Setting Pessimistic Concurrency को भी Represent करता है। इसलिए इस Setting को Disconnected Mode के लिए उपयोग में नहीं लिया जाना चाहिए। इस Isolation Level को Oracle द्वारा Support नहीं किया जाता।
Snapshot
इस Value को Set करके हम त्वूे पर Place होने वाले Locks को रोक देते हैं। यानी यदि कोई Transaction A किसी Data को Modify कर रहा हो, तो Transaction B उस Modify हो रहे Data को नहीं देख सकता। इस Setting की महत्वपूर्ण बात ये है कि Transaction B Lock नहीं होता और Transaction A के शुरू होने से पहले के Data को Snapshot के रूप में Read कर सकता है। इसलिए इस प्रकार का Isolation Level उस प्रकार के Applications में Use किया जाता है, जहां Long Running Queries में Data Integrity की जरूरत होती है, लेकिन Data को Modify नहीं किया जाना होता। ये Isolation Level भी Optimistic Concurrency Model को ही Represent करता है।
Serializable
इस Isolation Level को Set करने पर Access होने वाले Data पर एक Lock Place हो जाता है, जिसकी वजह से कोई भी अन्य User तब तक DataSet में Record को Insert या Update नहीं कर सकता, जब तक कि Transaction Complete नहीं हो जाता। ये Lock Row, Page या Table किसी पर भी Apply किया जा सकता है, जो कि पूरी तरह से Underlying Database Specific बहुत सारे Factors पर निर्भर करता है।
ये Isolation Level तब Use किया जाना चाहिए, जब हम चाहते हैं कि Data तब तक Change न हो, जब तक कि हमारे Transaction की Processing Complete न हो जाए। सामान्यत: इसे तब Use किया जाता है, जब हमारे Application को Rows के एक Set के साथ काम करना होता है और Transaction के सभी Operations के दौरान उन सभी Rows का Absolutely Consistent रहना जरूरी होता है।
ये Isolation Level Cleanest Data की Security देता है, लेकिन ये ही Isolation Level सबसे ज्यादा Database स्वबो भी Place करता है और इसे केवल तभी Use किया जाना चाहिए, जब हमें हमारे Data पर Pessimistic Locking के साथ Absolute Control की जरूरत हो। इस Isolation Level को Use करने का Negative Impact, Highly Concurrent System में Database की Performance पर पडता है।
Unspecified
इस मान को Specify करने पर उपरोक्त में से कोई भी Isolation Level Apply नहीं होता, बल्कि एक अलग प्रकार का Isolation Level Use होता है, जिसे Determine करना सम्भव नहीं होता।
इन Isolation Values को उस समय BeginTransaction() Method में Parameter के रूप में Supply किया जाता है, जब हम Transaction को Begin कर रहे होते हैं। जब हम इन Isolation Levels को Use करते हैं, तो इस बात की जानकारी हमें स्वयं रखनी पडती है, कि हम जिस Isolation Level को Specify कर रहे हैं, उसे Underlying Database Support करता है या नहीं। जबकि Use हो रहे Isolation Level की जानकारी प्राप्त करने के लिए हम Transaction Object की IsolationLevel Property को Use कर सकते हैं। Transactions की Working को समझने के लिए हम निम्नानुसार एक Code Segment Use कर सकते हैं:
SqlConnection connection1 = new SqlConnection(connectionString); SqlConnection connection2 = new SqlConnection(connectionString); SqlCommand command1 = connection1.CreateCommand(); SqlCommand command2 = connection2.CreateCommand(); connection1.Open(); connection2.Open(); SqlTransaction transaction1 = connection1.BeginTransaction(); command1.Transaction = transaction1; SqlTransaction transaction2 = connection2.BeginTransaction(IsolationLevel.ReadUncommitted); command2.Transaction = transaction2;
इस Code Segment में हमे सबेस पहले Test नाम के Database पर एक Connection Open किया है और इस Connection के लिए एक Transaction शुरू किया है, जिसका Isolation Level “ReadCommitted” ही है जो कि Default Isolation Level होता है।
फिर हमने एक और Connection Open किया है जिसके BeginTransaction() Method में हमने ReadUncommitted Isolation Level को Specify किया है।
फिर पहले Transaction द्वारा हमने Customers Table में एक Row को Insert किया है। जबकि इस First Transaction को Commit किए बिना ही इस Insert होने वाली Row को दूसरे Transaction में Fetch कर दिया है, जिसका Isolation Level ReadUncommitted है। यदि हम उपरोक्त Code को Actual Console Application में Specify करके Run करें, तो इस Code के Execute होने पर हम देख सकते हैं कि हालांकि पहला Transaction अभी तक Complete नहीं हुआ है, फिर भी दूसरा Transaction, पहले Transaction द्वारा Insert किए गए Record को Read कर सकता है।
यदि इसी Code को थोडा और आगे बढाऐं और पहले Transaction द्वारा Inserted Record को Rollback कर दें, तथा फिर से दूसरे Transaction में Newly Inserted Row को Fetch करें, तो इस बार वही Output प्राप्त नहीं होता, जैसा पिछली बार हुआ था। जिसका मतलब यही है कि ReadUncommitted Isolation Level एक Reliable Isolation Level नहीं है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF