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

PostgreSQL लॉक प्रतीक्षा की अवधि को नियंत्रित करना

नहीं। FOR UPDATE केवल उन पंक्तियों को लॉक करता है , ताकि एक और लेन-देन जो उन्हें लॉक करने का प्रयास करता है (FOR SHARE . के साथ) , FOR UPDATE , UPDATE या DELETE ) तब तक ब्लॉक करता है जब तक आपका लेन-देन नहीं हो जाता या वापस नहीं आ जाता।

यदि आप एक संपूर्ण टेबल लॉक चाहते हैं जो आपको सम्मिलित/अपडेट/डिलीट को ब्लॉक करता है जो शायद आप चाहते हैं LOCK TABLE ... IN EXCLUSIVE MODE

  1. देखें lock_timeout सेटिंग . यह 9.3 में जोड़ा गया था और पुराने संस्करणों में उपलब्ध नहीं है।

    पुराने संस्करणों के लिए कच्चे अनुमान statement_timeout . के साथ प्राप्त किए जा सकते हैं , लेकिन इससे बयानों को अनावश्यक रूप से रद्द किया जा सकता है। अगर statement_timeout 1s है और एक स्टेटमेंट लॉक पर 950ms की प्रतीक्षा करता है, तो यह लॉक प्राप्त कर सकता है और आगे बढ़ सकता है, केवल एक टाइमआउट द्वारा तुरंत रद्द किया जा सकता है। वह नहीं जो आप चाहते हैं।

    lock_timeout सेट करने का कोई क्वेरी-स्तरीय तरीका नहीं है , लेकिन आप कर सकते हैं और बस चाहिए:

    SET LOCAL lock_timeout = '1s';

    आपके बाद BEGIN एक लेन-देन।

  2. एक बयान है समय समाप्त हो गया है, लेकिन लॉक लेनदेन पर आयोजित किए जाते हैं स्तर। कोई लेन-देन समयबाह्य सुविधा नहीं है।

    यदि आप सिंगल-स्टेटमेंट लेनदेन चला रहे हैं तो आप बस एक statement_timeout . सेट कर सकते हैं यह कितनी देर तक चल सकता है इसे सीमित करने के लिए कथन चलाने से पहले। यह लॉक को कितनी देर तक रोक सकता है, इसे सीमित करने जैसी बात नहीं है, हालांकि, यह लॉक के लिए अनुमत 1s के 900ms तक प्रतीक्षा कर सकता है, केवल वास्तव में 100ms के लिए लॉक को पकड़ सकता है, फिर टाइमआउट तक रद्द हो जाता है।

  3. नहीं। आपको यह अवश्य करना चाहिए:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. SET LOCAL इसके लिए उपयुक्त और पसंदीदा है।

    क्वेरी के टेक्स्ट में इसे करने का कोई तरीका नहीं है, यह एक अलग स्टेटमेंट होना चाहिए।

    आपके द्वारा लिंक की गई मेलिंग सूची पोस्ट एक काल्पनिक सिंटैक्स के लिए एक प्रस्ताव है जिसे कभी लागू नहीं किया गया था (कम से कम एक सार्वजनिक पोस्टग्रेएसक्यूएल रिलीज में) और मौजूद नहीं है।

इस तरह की स्थिति में आप "आशावादी समवर्ती नियंत्रण" पर विचार करना चाहेंगे, जिसे अक्सर "आशावादी लॉकिंग" कहा जाता है। यह आपको क्वेरी दोहराव की बढ़ी हुई दरों और अधिक एप्लिकेशन लॉजिक की आवश्यकता की कीमत पर लॉकिंग व्यवहार पर अधिक नियंत्रण प्रदान करता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बल्क अपडेट और डिलीट ऑपरेशन करते समय PostgreSQL गतिरोध से बचना

  2. कैसे बताएं कि पोस्टग्रेज टेबल कब क्लस्टर किया गया था और किस इंडेक्स का इस्तेमाल किया गया था

  3. JSONB sqlalchemy एग्रीगेट फंक्शन

  4. समग्र प्राथमिक कुंजी के साथ अनुक्रम

  5. Dbplyr का उपयोग करते समय दिनांक को वर्ष-तिमाही प्रारूप में परिवर्तित करना