मुझे नहीं लगता कि यह संभव है। आप किसी तालिका में केवल पढ़ने के लिए पहुंच को अवरुद्ध नहीं कर सकते (जब तक कि चयन नहीं किया जाता है FOR UPDATE
)
जहां तक मैं बता सकता हूं, आपके पास pg_advisory_lock()
का उपयोग करने का एकमात्र मौका है समारोह।
http://www .postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
लेकिन इसके लिए इसके माध्यम से प्राप्त तालों की "मैनुअल" रिलीज की आवश्यकता होती है। इसके साथ आपको स्वचालित अनलॉकिंग नहीं मिलेगी।
पंक्तियों को लॉक करने के लिए आपको कुछ इस तरह की आवश्यकता होगी:
select pg_advisory_lock(id), * from ( select * table1 order by id limit 5 ) t
(LIMIT भाग के लिए व्युत्पन्न तालिका के उपयोग पर ध्यान दें। स्पष्टीकरण के लिए मैंने जो मैन्युअल लिंक पोस्ट किया है उसे देखें)
फिर आपको प्राप्त आईडी को स्टोर करना होगा और बाद में pg_advisory_unlock()
पर कॉल करना होगा। प्रत्येक आईडी के लिए।
यदि प्रत्येक प्रक्रिया हमेशा सभी releasing जारी कर रही है आईडी एक बार में, आप बस pg_advisory_unlock_all()
. का उपयोग कर सकते हैं बजाय। फिर आपको प्राप्त आईडी को संग्रहीत करने की आवश्यकता नहीं होगी।
ध्यान दें कि यह नहीं होगा दूसरों को "सामान्य" चयनों का उपयोग करके पंक्तियों को पढ़ने से रोकें। यह तभी काम करेगा जब उस तालिका तक पहुंचने वाली प्रत्येक प्रक्रिया ताले प्राप्त करने के समान पैटर्न का उपयोग करती है।