2012-04-23 6 views
6

मुझे लगता है कि पोस्टग्रेज़ में सलाहकार लॉकिंग के बारे में मुझे कुछ बुनियादी बात नहीं है। अगर मैं psql कमांड लाइन ग्राहक पर निम्न कमांड दर्ज करते हैं, समारोह सच रिटर्न दोनों बार:पोस्टग्रेज़ में सलाहकार ताले प्राप्त करना

SELECT pg_try_advisory_lock(20); --> true 
SELECT pg_try_advisory_lock(20); --> true 

मैं उम्मीद कर रहा था कि दूसरा आदेश झूठी लौटना चाहिए, के बाद से लॉक पहले अधिग्रहण किया गया है चाहिए। अजीब तरह, मैं निम्नलिखित मिलता है, सुझाव है कि ताला दो बार प्राप्त किया गया है:

SELECT pg_advisory_unlock(20); --> true 
SELECT pg_advisory_unlock(20); --> true 
SELECT pg_advisory_unlock(20); --> false 

तो मुझे लगता है कि मेरे सवाल है, कैसे एक एक तरह से बंद हो जाता है कि यह फिर से अधिग्रहण किया जा रहा में एक सलाहकार ताला प्राप्त करता है?

+8

उसी सत्र से आप जितनी बार चाहें उतनी बार लॉक प्राप्त कर सकते हैं; लेकिन आपको एक ही सत्र लॉक प्राप्त करने से पहले इसे उसी समय जारी करना होगा या सत्र बंद करना होगा। – kgrittn

उत्तर

11

क्या होगा यदि आप इसे 2 अलग PostgreSQL सत्रों से करने का प्रयास करेंगे?

और देखें in the docs

+2

आह मैं देखता हूं, इसलिए एक बार एक सत्र ने लॉक हासिल कर लिया है, यह फिर से हासिल कर सकता है, लेकिन दूसरा सत्र नहीं कर सकता है। धन्यवाद! – foldl

3

सलाहकार ताले पर मेरा पहला प्रभाव समान था। मुझे दूसरी क्वेरी की उम्मीद है (चयन करें pg_tryadvisory_lock (20)) झूठी वापसी के लिए (क्योंकि पहले को लॉक मिला)। लेकिन इस क्वेरी ने केवल पुष्टि की है कि मूल्य 20 के साथ एक बड़ा लॉक है। व्याख्या उपयोगकर्ता के लिए है।

सलाहकार ताले की एक तालिका के रूप में कल्पना करें जहां आप एक मूल्य स्टोर कर सकते हैं और उस मान पर लॉक प्राप्त कर सकते हैं (आमतौर पर एक BigInt)। यह कोई स्पष्ट ताला नहीं है और कोई भी संक्रमण में देरी नहीं होगी। यह आप पर निर्भर करता है कि परिणाम की व्याख्या कैसे करें और इसका उपयोग कैसे करें - और यह अवरुद्ध नहीं है।

मैं इसे दो-पूर्णांक-विकल्पों के साथ अपनी परियोजनाओं में उपयोग करता हूं। चुनें pg_try_advisory_lock (classId, objId) जबकि दोनों पैरामीटर पूर्णांक हैं।

SELECT pg_try_advisory_lock((SELECT 'first_table'::regclass::oid)::integer, 17);

"first_table" इस उदाहरण में है:

यह एक से अधिक तालिका के साथ काम सिर्फ CLASSID के रूप में मेज और प्राथमिक आईडी (यहां 17) के रूप में ObjId की OID का उपयोग करने के लिए तालिका का नाम और दूसरा पूर्णांक प्राथमिक कुंजी आईडी है (यहां: 17)।

पैरामीटर के रूप में एक बड़े पैमाने पर उपयोग करने से आईडी की विस्तृत श्रृंखला की अनुमति मिलती है, लेकिन यदि आप आईडी 17 की तुलना में इसे "second_table" के साथ उपयोग करते हैं तो भी लॉक किया जाता है (क्योंकि आपने "17" संख्या को लॉक किया है और एक विशिष्ट पंक्ति से संबंध नहीं है एक टेबल में)।

मुझे इसे समझने में कुछ समय लगा, इसलिए उम्मीद है कि यह सलाहकार ताले के आंतरिक कार्य को समझने में मदद करता है।

+0

मुझे यह समझ में नहीं आया .. आप उल्लेख करते हैं, लेकिन यदि आप आईडी 17 की तुलना में इसे "second_table" के साथ उपयोग करते हैं तो साथ ही लॉक किया गया है 'उपरोक्त मामले में आईडी 17 कैसे लॉक किया जाएगा जब मैं निम्नलिखित क्वेरी का उपयोग करता हूं 'चुनें pg_try_advisory_lock ((SELECT' first_table ':: regclass :: oid) :: पूर्णांक, 17); ' – Viren