PostgreSQL 12 अपडेट :शीर्ष-स्तरीय PROCEDURE . के लिए सीमित समर्थन है s जो लेनदेन नियंत्रण कर सकता है। आप अभी भी नियमित SQL-कॉल करने योग्य फ़ंक्शन में लेन-देन का प्रबंधन नहीं कर सकते हैं, इसलिए नई शीर्ष-स्तरीय प्रक्रियाओं का उपयोग करने के अलावा नीचे दी गई जानकारी सही रहती है।
फ़ंक्शंस उस लेन-देन का हिस्सा हैं जिनसे उन्हें बुलाया जाता है। यदि लेन-देन वापस ले लिया जाता है तो उनके प्रभाव वापस लुढ़क जाते हैं। यदि लेन-देन करता है तो उनका काम होता है। कोई भी BEGIN ... EXCEPT फ़ंक्शन के भीतर ब्लॉक SAVEPOINT जैसे सेवपॉइंट की तरह (और हुड के उपयोग के तहत) काम करते हैं और ROLLBACK TO SAVEPOINT SQL कथन।
BEGIN ... EXCEPT को छोड़कर, फ़ंक्शन या तो पूरी तरह से सफल हो जाता है या पूरी तरह से विफल हो जाता है त्रुटि प्रबंधन। यदि फ़ंक्शन के भीतर कोई त्रुटि उठाई जाती है और उसे संभाला नहीं जाता है, तो फ़ंक्शन को कॉल करने वाला लेनदेन निरस्त कर दिया जाता है। निरस्त किए गए लेनदेन प्रतिबद्ध नहीं हो सकते हैं, और यदि वे COMMIT करने का प्रयास करते हैं ROLLBACK . के रूप में माना जाता है , जैसा कि किसी अन्य त्रुटिपूर्ण लेनदेन के लिए है। ध्यान दें:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
देखें कि लेन-देन, जो शून्य विभाजन के कारण त्रुटि स्थिति में है, COMMIT पर वापस कैसे आता है ?
यदि आप एक स्पष्ट आसपास के लेन-देन के बिना किसी फ़ंक्शन को कॉल करते हैं तो नियम बिल्कुल वैसे ही होते हैं जैसे किसी अन्य पीजी स्टेटमेंट के लिए:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(जहां COMMIT विफल हो जाएगा यदि SELECT एक त्रुटि उठाई)।
PostgreSQL (अभी तक) कार्यों में स्वायत्त लेनदेन का समर्थन नहीं करता है, जहां प्रक्रिया/कार्य कॉलिंग लेनदेन से स्वतंत्र रूप से प्रतिबद्ध/रोलबैक कर सकता है। इसे dblink के माध्यम से एक नए सत्र का उपयोग करके अनुकरण किया जा सकता है।
लेकिन , ऐसी चीजें जो लेन-देन संबंधी नहीं हैं या अपूर्ण रूप से लेन-देन वाली हैं, PostgreSQL में मौजूद हैं। यदि इसका सामान्य BEGIN; do stuff; COMMIT; ब्लॉक, इसका एक फ़ंक्शन में गैर-लेनदेन व्यवहार भी है। उदाहरण के लिए, nextval और setval , TRUNCATE , आदि.