जहां तक मैं समझता हूं, यह तथ्य कि हमारी क्वेरी लॉक का इंतजार कर रही है, इसका मतलब है कि यह हमेशा लॉक का इंतजार करता रहा है, और इसने कभी भी कुछ भी नहीं बदला है।
सही - अगर आप देखते हैं कि pg_stat_activity.waiting एक ALABLE टेबल के लिए "सत्य" है, तो इसका लगभग निश्चित रूप से मतलब है कि यह धैर्यपूर्वक अपने लक्ष्य तालिका पर ACCESS EXCLUSIVE लॉक की प्रतीक्षा कर रहा है, और इसके वास्तविक कार्य (यदि आवश्यक हो तो तालिका को फिर से लिखना, कैटलॉग बदलना) , पुनर्निर्माण अनुक्रमित, आदि) अभी तक शुरू नहीं हुआ है।
क्या यह हमारे लिए सुरक्षित है कि हम अपनी वैकल्पिक क्वेरी को रद्द कर दें? या क्या यह संभव है कि क्वेरी पहले से ही कुछ संशोधित कर चुकी है और इसे रद्द करने से हमारा डेटाबेस किसी तरह से आधे रास्ते में चला जाएगा?
PostgreSQL में प्रश्नों को रद्द करना (या, समतुल्य रूप से लेन-देन को वापस करना) में कोई भी डेटाबेस भ्रष्टाचार का खतरा नहीं है, जिसे आप कुछ अन्य डेटाबेस (जैसे कि इस पृष्ठ के निचले भाग में भयानक चेतावनी ) द्वारा फैलाया जा सकता है । यही कारण है कि गैर-सुपरयुसर, हाल के संस्करणों में, अन्य बैकएंड में चल रहे अपने स्वयं के प्रश्नों का उपयोग करने pg_cancel_backend()
और pg_terminate_backend()
मारने के लिए स्वतंत्र हैं - वे डेटाबेस भ्रष्टाचार के बारे में बात किए बिना उपयोग करने के लिए सुरक्षित हैं। आखिरकार, PostgreSQL को OOM किलर, सर्वर शटडाउन इत्यादि जैसे SIGKILL से मारे जाने वाली किसी भी प्रक्रिया से निपटने के लिए तैयार रहना होगा, जो कि वाल लॉग के लिए है।
आपने यह भी देखा होगा कि PostgreSQL में, एक (बहु-स्टेटमेंट) लेनदेन के अंदर नेस्टेड डीडीएल कमांड का प्रदर्शन करना संभव है।
BEGIN;
ALTER TABLE foo ...;
ALTER TABLE bar ...;
-- more stuff
COMMIT; -- or ROLLBACK; if you've changed your mind
(यह सुनिश्चित करने के लिए कि स्कीमा माइग्रेशन सभी में एक साथ या बिल्कुल नहीं चलते हैं।) आपने कहा, हालांकि:
हमने लेन-देन में लपेट नहीं किया ALTER TABLE
।
यह एक आदेश के लिए ठीक है - डॉक्स से ,
PostgreSQL वास्तव में लेनदेन के भीतर निष्पादित होने के रूप में हर SQL स्टेटमेंट को मानता है। यदि आप एक BEGIN आदेश जारी नहीं करते हैं, तो प्रत्येक व्यक्ति के कथन में एक अंतर्निहित BEGIN है और (यदि सफल) COMMIT उसके चारों ओर लिपटा हुआ है। BEGIN और COMMIT द्वारा घिरे बयानों के समूह को कभी-कभी लेन-देन ब्लॉक कहा जाता है।
इस प्रकार, रद्द करने के ALTER TABLE
माध्यम से pg_cancel_backend()
या तो, या एक Ctrl-C जो नियंत्रित psql प्रॉम्प्ट से जारी किया गया है, का एक समान प्रभाव होगा जैसे आपने किया था
BEGIN;
ALTER TABLE ... ;
ROLLBACK;
(यद्यपि आपको उम्मीद है कि देखने के लिए, उस महंगी ALTER TABLE
को रद्द करने से डेटाबेस को अनावश्यक पीसने से बचाया जा सकता है यदि आप अभी ROLLBACK
भी वैसे ही जा रहे हैं ।)