2012-05-08 9 views
12

पीडीओ लेनदेन ब्लॉक के भीतर कॉल काम कर सकते हैं? यह सरल है कोड (MySql डेटाबेस का प्रयोग करके) ...पीडीओ लेनदेन और समारोह कॉल

try{ 
    $db->beginTransaction(); 

    // call to function that creates user 
    $user_id = create_user(); 

    // call to function that creates company  
    $company_id = create_company(); 

    // call to function to link user & company 
    add_user_to_company($user_id, $company_id); 

    $db->commit(); 
} 

इस तो लेन-देन का उपयोग कर ऐसा नहीं हो सकता, की सिफारिश की रणनीति क्या है?

उत्तर

11

जब तक कि इनमें से कोई भी फ़ंक्शन कॉल लेनदेन को खोलने या प्रतिबद्ध करने का प्रयास नहीं करता है, या $db में संग्रहित किसी से अलग कनेक्शन का उपयोग नहीं करता है, तो इसे ठीक काम करना चाहिए। पीडीओ ऑब्जेक्ट (या उस मामले के लिए आरडीबीएमएस) यह नहीं जानता है कि आप PHP में अन्य कार्यों को कॉल कर रहे हैं या नहीं। यह सब जानता है कि अगर कार्रवाई उसी खुले कनेक्शन पर हो रही है जैसे $db में खोला गया है। हम मानते हैं कि उन कार्यों को या तो पैरामीटर के रूप में $db प्राप्त होता है या इसे वैश्विक रूप से एक्सेस किया जाता है।

याद रखें कि हालांकि पीडीओ लेनदेन की स्थिति का ट्रैक रखता है (PDO::inTransaction() के माध्यम से खुलासा), यह वास्तव में आरडीबीएमएस है जो लेनदेन राज्य का प्रबंधन कर रहा है, न कि पीडीओ या PHP आवेदन कोड। यदि, कोई कार्य पिछले एक से पहले एक नया लेनदेन खोलने का प्रयास करता है, तो MySQL's documented behavior पिछले लेन-देन को स्वतः प्रतिबद्ध करना है क्योंकि यह लेनदेन घोंसले का समर्थन नहीं करता है।

तो बस सुनिश्चित करें कि आपकी अतिरिक्त फ़ंक्शन कॉल लेनदेन स्थिति को बदलने का प्रयास नहीं कर रही हैं।

+1

आगे स्पष्टीकरण के लिए, नेस्टेड लेनदेन MySQL में समर्थित नहीं हैं, इसलिए सुनिश्चित करें कि आप किसी भी कार्य में लेनदेन शुरू नहीं कर रहे हैं, अन्यथा यह [लंबित लेनदेन स्वचालित रूप से प्रतिबद्ध करेगा] (http: //dev.mysql .com/doc/RefMan/5.5/en/अंतर्निहित-commit.html)। –

+1

यह भी सुनिश्चित करें कि किसी भी प्रकार के डीडीएल (निर्माण/परिवर्तन/ड्रॉप स्टेटमेंट) का उपयोग न करें क्योंकि वे आपके द्वारा किए जा रहे किसी भी लेनदेन को पूरा करेंगे। – Kris