लेन-देन के साथ काम करते समय मैं आमतौर पर जिस विचार का उपयोग करता हूं वह इस तरह दिखता है (अर्ध-छद्म कोड) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
ध्यान दें कि, इस विचार के साथ, यदि कोई क्वेरी विफल हो जाती है, तो एक अपवाद अवश्य फेंका जाना चाहिए:
- पीडीओ ऐसा कर सकता है, यह इस पर निर्भर करता है कि आप इसे कैसे कॉन्फ़िगर करते हैं
- देखें
PDO::setAttribute
- और
PDO::ATTR_ERRMODE
औरPDO::ERRMODE_EXCEPTION
- देखें
- अन्यथा, किसी अन्य एपीआई के साथ, आपको किसी क्वेरी को निष्पादित करने के लिए उपयोग किए गए फ़ंक्शन के परिणाम का परीक्षण करना पड़ सकता है, और स्वयं एक अपवाद फेंकना पड़ सकता है।
दुर्भाग्य से, इसमें कोई जादू शामिल नहीं है। आप केवल कहीं एक निर्देश नहीं डाल सकते हैं और लेनदेन स्वचालित रूप से कर सकते हैं:आपको अभी भी यह निर्दिष्ट करना होगा कि लेनदेन में प्रश्नों के किस समूह को निष्पादित किया जाना चाहिए।
उदाहरण के लिए, प्राय:आपके पास लेन-देन से पहले कुछ प्रश्न होंगे (begin
) और लेन-देन के बाद कुछ और प्रश्न (commit
. के बाद या rollback
) और आप चाहते हैं कि उन प्रश्नों को निष्पादित किया जाए चाहे कुछ भी हो (या नहीं) लेन-देन में।