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

Oracle में तिरछा विसंगति लिखें और PostgreSQL लेनदेन को रोलबैक नहीं करता है

1995 के पेपर में, एएनएसआई एसक्यूएल अलगाव स्तरों की आलोचना , जिम ग्रे और सह, ने फैंटम रीड को इस प्रकार वर्णित किया:

इसलिए, एक फैंटम रीड का मतलब यह नहीं है कि आप वर्तमान में चल रहे लेन-देन की शुरुआत के रूप में एक स्नैपशॉट वापस कर सकते हैं और यह दिखावा कर सकते हैं कि एक क्वेरी के लिए एक ही परिणाम प्रदान करना वास्तविक फैंटम रीड विसंगति के खिलाफ आपकी रक्षा करने वाला है।

मूल SQL सर्वर 2PL (टू-फ़ेज़ लॉकिंग) कार्यान्वयन में, एक क्वेरी के लिए समान परिणाम लौटाता है जो प्रेडिकेट लॉक्स को निहित करता है।

एमवीसीसी (बहु-संस्करण संगामिति नियंत्रण) स्नैपशॉट अलगाव (ओरेकल में गलत तरीके से सीरियल करने योग्य नाम) वास्तव में अन्य लेन-देन को उन पंक्तियों को सम्मिलित/हटाने से नहीं रोकता है जो पहले से निष्पादित क्वेरी के साथ समान फ़िल्टरिंग मानदंड से मेल खाते हैं और हमारे वर्तमान चल रहे परिणाम सेट को वापस कर देते हैं। लेन-देन।

इस कारण से, हम निम्नलिखित परिदृश्य की कल्पना कर सकते हैं जिसमें हम सभी कर्मचारियों के लिए वेतन वृद्धि लागू करना चाहते हैं:

  1. Tx1:SELECT SUM(salary) FROM employee where company_id = 1;
  2. Tx2:INSERT INTO employee (id, name, company_id, salary) VALUES (100, 'John Doe', 1, 100000);
  3. Tx1:UPDATE employee SET salary = salary * 1.1;
  4. Tx2:COMMIT;
  5. Tx1:COMMIT:

इस परिदृश्य में, CEO पहला लेन-देन (Tx1) चलाता है, इसलिए:

  1. वह सबसे पहले अपनी कंपनी के सभी वेतनों के योग की जांच करती हैं।
  2. इस बीच, मानव संसाधन विभाग दूसरा लेनदेन (Tx2) चलाता है क्योंकि वे अभी-अभी जॉन डो को काम पर रखने में कामयाब हुए हैं और उन्हें 100k $ वेतन दिया है।
  3. सीईओ ने फैसला किया है कि वेतन की कुल राशि को ध्यान में रखते हुए 10% की वृद्धि संभव है, इस बात से अनजान है कि वेतन राशि 100k हो गई है।
  4. इस बीच, मानव संसाधन लेनदेन Tx2 प्रतिबद्ध है।
  5. Tx1 प्रतिबद्ध है।

बूम! सीईओ ने एक पुराने स्नैपशॉट पर एक निर्णय लिया है, जो वर्तमान अद्यतन वेतन बजट द्वारा बनाए नहीं रखा जा सकता है।

आप इस उपयोग के मामले (बहुत सारे आरेखों के साथ) की विस्तृत व्याख्या निम्न पोस्ट में देख सकते हैं

क्या यह फैंटम रीड है या तिरछा लिखें ?

जिम ग्रे के अनुसार और सह , यह एक फैंटम रीड है क्योंकि राइट स्क्यू को इस प्रकार परिभाषित किया गया है:

Oracle में, लेन-देन प्रबंधक उपरोक्त विसंगति का पता लगा भी सकता है और नहीं भी, क्योंकि यह विधेय ताले या इंडेक्स रेंज लॉक्स (नेक्स्ट-की लॉक्स) , MySQL की तरह।

PostgreSQL इस विसंगति को पकड़ने का प्रबंधन तभी करता है जब बॉब कर्मचारी तालिका के खिलाफ एक पठन जारी करता है, अन्यथा, घटना को रोका नहीं जाता है।

अपडेट करें

प्रारंभ में, मैं यह मान रहा था कि Serializability एक समय आदेश देने वाला भी होगा। हालांकि, जैसा कि पीटर बैलिस द्वारा बहुत अच्छी तरह समझाया गया है , वॉल-क्लॉक ऑर्डरिंग या लीनियरिज़ेबिलिटी केवल सख्त सीरियलाइज़ेबिलिटी के लिए मानी जाती है।

इसलिए, मेरी धारणा एक सख्त धारावाहिक प्रणाली के लिए बनाई गई थी। लेकिन ऐसा नहीं है जो Serializable की पेशकश करने वाला है। सीरियल करने योग्य अलगाव मॉडल समय के बारे में कोई गारंटी नहीं देता है, और संचालन को तब तक पुन:व्यवस्थित करने की अनुमति है जब तक वे कुछ के बराबर हैं सीरियल निष्पादन।

इसलिए, Serializable परिभाषा के अनुसार, यदि दूसरा लेन-देन कोई पठन जारी नहीं करता है, तो ऐसा फैंटम रीड हो सकता है। लेकिन, एक सख्त सीरियल करने योग्य मॉडल में, 2PL द्वारा पेश किया जाने वाला, फैंटम रीड को रोका जाएगा, भले ही दूसरा लेनदेन उन्हीं प्रविष्टियों के खिलाफ रीड जारी न करे, जिन्हें हम फैंटम रीड से बचाने की कोशिश कर रहे हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres 9.4 से बड़े ऑब्जेक्ट डेटा को कैसे डंप करें, और फिर इसे Postgres8.x पर आयात करें?

  2. स्प्रिंग डेटा जेपीए ऑडिटिंग @Modifying एनोटेशन के साथ जेपीए रिपोजिटरी अपडेट विधि के लिए काम नहीं कर रहा है, क्यों?

  3. Postgresql CASE स्टेटमेंट - क्या मैं अपने SELECT में CASE के रिटर्न वैल्यू का उपयोग कर सकता हूं?

  4. JPA 2.1 PostgreSQL और REF_CURSORs के साथ StoredProcedureQuery

  5. संग्रहीत फ़ंक्शन या प्रक्रिया को कॉल करना सम्मिलित नहीं होगा और परिवर्तन जारी रखेगा